4

我试图从:

'hello how are you today'

'helloHowAreYouToday'

我以为asCapitalizedPhrase asLegalSelector可以解决问题,但事实并非如此。

这样做的正确方法是什么?

编辑:

我想我应该澄清我的问题;我已经有办法将字符串转换为 camelCase 选择器:

|aString aCamelCaseString|
aString := aString findTokens: $ .
aCamelCaseString := aString first.
aString allButFirst do: [:each | aCamelCaseString := aCamelCaseString , each capitalized].

我只是想知道 Pharo 是否有标准的系统方法来实现相同的目标:)

4

4 回答 4

8

How about this?

| tokens |
tokens := 'this is a selector' findTokens: Character space.
tokens allButFirst
    inject: tokens first
    into: [:selector :token | selector, token capitalized]
于 2011-02-23T14:30:49.243 回答
3

我认为没有现有的方法可以做到这一点。

这是解决您的问题的实现:

input := 'hello how are you today'.
output := String streamContents: [ :stream |
    | capitalize |
    capitalize := false.
    input do: [ :char |
        char = Character space
            ifTrue: [ capitalize := true ]
            ifFalse: [
                stream nextPut: (capitalize
                    ifTrue: [ char asUppercase ]
                    ifFalse: [ char ]).
                capitalize := false ] ] ].

编辑:注意,与弗兰克的解决方案相比,这个解决方案更长,但它不会因为空输入而中断,并且它不会为每个步骤创建一个新的字符串实例,因为它流过输入,这样更有效(如果你有大字符串)。

于 2011-02-23T13:40:09.953 回答
1

你不说你用的是哪个版本的Pharo,而是在stable 5.0中,

'hello world this is a selector' asCamelCase asValidSelector

产量

helloWorldThisIsASelector

要获得我正在使用的运行:

curl get.pharo.org/50+vm | bash 
于 2016-01-23T05:58:48.547 回答
0

我知道这是旧的,但 Squeak 有一个有用的实现(String>>asCamelCase),它基本上是这样做的:

(String
    streamContents: [:stream | 'hello world' substrings
            do: [:sub | stream nextPutAll: sub capitalized]]) asLegalSelector
于 2016-01-21T13:19:16.910 回答