代码之家  ›  专栏  ›  技术社区  ›  mydoghasworms

字符串或整个字符串的前n个字符;没有订阅自动边界

  •  5
  • mydoghasworms  · 技术社区  · 6 年前

    在Pharo7中,我试图获取一个字符串的第一个字符数,或者只是整个字符串(如果请求的字符数超过了字符串的长度)。

    但是,下面的示例会导致一个错误,而我只希望它返回整个字符串:

        'abcdef' copyFrom: 1 to: 30. "=> SubscriptOutOfBounds Error"
        'abcdef' first: 30. "=> SubscriptOutOfBounds Error"
        'abcdef' first: 3. "=> 'abc'; OK"
    

    如果请求的长度超过字符串长度,是否有一个方法只返回整个字符串?

    为了解决这个问题,我首先检查了字符串的长度,然后只发送 first: 如果长度超过最大长度,但不太优雅:

    label := aTaskbarItemMorph label size < 30 ifTrue: [ aTaskbarItemMorph label ] ifFalse: [ aTaskbarItemMorph label first: 30 ].
    
    4 回复  |  直到 6 年前
        1
  •  4
  •   Peter Uhnak    6 年前

    字符串>>截断为:

    'abcdef' truncateTo: 30. "'abcdef'"
    'abcdef' truncateTo: 3. "'abc'"
    
        2
  •  5
  •   Leandro Caniglia Charlie    6 年前

    救援方法探索者

    我们还应该记住,对于这种情况,我们有 MethodFinder 在Pharo。你可以通过评估你的例子来使用它。在我们的例子中

    MethodFinder methodFor: #(('abcdef' 30) 'abcdef' ('abcdef' 3) 'abc')
    

    将生产

    "'(data1 contractTo: data2) (data1 truncateTo: data2) '"
    

    其中包含已经提到的 #truncateTo: 并添加 #contractTo: . 注意,后者实现了缩短技术的其他风格,即

    'abcdef' contractTo: 6 "'a...f'"
    

    可能不是你今天想要的,而是一条将来可能有用的信息。


    句法

    句法 方法查找器 需要一个 Array 长度的 2 * #examples ,其中每个示例都由一对( 输入参数 , 结果 )

    有趣的是,吱吱声支架使提供动态创建的示例变得容易:

    input := 'abcdef'.
    n := 1.
    MethodFinder methodFor: {
         {input. input size + n}. input.
         {input. input size - n}. input allButLast
    }
    

    也会找到 truncateTo: .

        3
  •  2
  •   Andrei Chis    6 年前

    String 类或其超类。你的解决方案很好。

    或者,使用较短的解决方法 min: 选择字符串的大小或有限的字符数。例如:

    string := '123456'.
    label := string first: (string size min: 5).
    

    另一个解决方案是将扩展方法添加到 做你想做的事。因此该方法将添加到 类,但放在您的包中。例如:

    String>>atMost: numberOfElement
        ^ self size < numberOfElement 
            ifTrue: [ self ] 
            ifFalse: [ self first: numberOfElement ]
    

    那么下面的内容就可以了:

    string := '123456'.
    string atMost: 2.  "'12'"
    string atMost: 10. "'123456'"
    

    在添加扩展方法时,可以在其名称中添加前缀,以避免可能的冲突,例如,如果该方法 atMost: 稍后将添加到Pharo中,或者如果另一个包也将定义这样的扩展方法。

        4
  •  2
  •   Leandro Caniglia Charlie    6 年前

    下面是一个简单的表达式,它将带来您想要的:

    aString readStream next: n