【问题标题】:split function in squeak Smalltalksqueak Smalltalk中的拆分功能
【发布时间】:2020-06-11 10:42:59
【问题描述】:

我目前正在练习 squeak-Smalltalk。 我想拆分一个字符串,它的行为有点像 Java 或 python 中的拆分函数,但在互联网上几乎找不到任何东西。请问有什么建议吗?如何实现?

谢谢!

【问题讨论】:

标签: string split smalltalk squeak


【解决方案1】:

我发现协议浏览器对回答这个问题最有帮助。以下是一些您可以尝试的选择器:

'foo, bar, baz' splitBy: ','. "#('foo' ' bar' ' baz')"
'foo, bar, baz' splitBy: ', '. "#('foo' 'bar' 'baz')"
'foo, bar, baz' findTokens: ', '. "an OrderedCollection('foo' 'bar' 'baz')"

但请注意,#splitBy:[Do:] 将参数解释为单个分隔符序列,#findTokens: 将其用作一组单个字符分隔符:

'foo bar, baz' splitBy: ', '. #('foo bar' ' baz')
'foo bar, baz' findTokens: ', '. an OrderedCollection('foo' 'bar' 'baz')

希望这会有所帮助。享受你的吱吱声!

【讨论】:

    【解决方案2】:

    SequenceableCollection >> splitBy: 至少从 2010 年 2 月开始就存在于 Squeak 图像中:

    ('1920x1080' splitBy: 'x') = #('1920' '1080')
    

    【讨论】:

      【解决方案3】:

      很遗憾没有,squeak 中似乎没有splitsplitBy: 消息(不像Pharo...)所以我自己实现了这样的方法。

      split: aSentence
      |count str strArr |
          str := aSentence.
          count := ((aSentence select: [:a | a = $ ])) size.
          strArr := OrderedCollection new.
          [count >= 0]
          whileTrue: [
              strArr add: (str copyFrom: 1 to: (str indexOf: $ ifAbsent: [str size + 1]) - 1).
              str := str copyFrom: ((str indexOf: $ ) + 1) to: (str size).
              count := count - 1.
          ].
      ^strArr
      

      【讨论】:

      • 只是评论:strArr 是个坏名字。您不需要在 Smalltalk 中告诉类型,在这种情况下会产生误导,因为它不是真正的数组而是 OrderedCollection。我建议只使用“字符串”或“子字符串”,复数告诉你它是一个集合和名称表明它包含什么。我还建议不要截断 str 名称,字符串会更好。
      • 无需自己实现:SequenceableCollection >> splitBy: 至少从 2010 年 2 月开始就存在于 Squeak 映像中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多