2

文字列の値を見つけようとしています。例えば、:

'abc' == 6  (1+2+3)

しかし、以下の「+ 要素」セクションでエラーが発生します。

MessageNotUnderstood: Character>>adaptToNumber:andSend:

誰か手を貸してくれませんか?

wordValue: inString
    |value|
    inString asUppercase.

    value := (inString do: [ :ch | inString inject: (ch asciiValue- 64) into: [ :sum :element | sum + element ]]) asInteger.
    ^value.
4

1 に答える 1

6

基本的に、ループ内で文字から整数への変換を行う必要があります。外側の do も必要ありません。

wordValue: aString
  ^aString inject: 0 into: [ :sum :ch | sum + (ch asUppercase asciiValue - 64)]

これですべてです。ブロックに 0 を挿入して開始します (これが開始合計であるため)。その後、ラウンドごとに、ブロックは現在の文字の合計に「値」を加えたものとして評価されます。

また、あなたのバージョンでは、文字列を大文字にしようとしていたように見えますが、ステートメントは

inString asUppercase.

何もしません。むしろ、文字列の新しい大文字バージョンを返しますが、それはどこにも保存されていません。inString 自体は変更されません (メッセージの 'as' プレフィックスは、過去形のメッセージ名と同様に、そのヒントを提供します)。最初に文字列全体を大文字にするのではなく、'asUppercase' メッセージ送信を個々の文字に追加しました。これにより、文字列を 1 回繰り返すだけで済みます。

于 2013-06-07T02:33:47.680 に答える