2013-06-07 3 views
2

Я пытаюсь найти значение строки. . Например,:Smalltalk - Получение значения строки

'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. 
+0

Я не особенно знаком с smalltalk, но 'str asUppercase inject: 0 в: [: sum: ch | sum + ch asciiValue - 64] 'работал для меня. Не уверен, что вы пытаетесь сделать с 'do:', но похоже, что это необязательно. Возможно, вы неправильно поняли «инъекцию»? – Kevin

ответ

6

В основном вы хотите делать переход от символа к целочисленным внутри ваш цикл Вам также не нужно внешнего сделать:

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

Это все есть на него - впрыснуть 0 в блок, чтобы начать с (так как это ваша стартовая сумма), то каждый раз раунд блок будет оценивать сумму плюс «значение» текущего символа.

Кроме того, в вашей версии, он выглядит, как вы пытаетесь прописной строка - но заявление

inString asUppercase. 

ничего не делает. Вернее, он возвращает новую прописную версию строки, которую вы тогда не храните нигде. Он не модифицирует сам inString (префикс «как» в сообщении дает нам подсказку, как и имя прошедшего времени). Вместо того, чтобы сначала перенести всю строку, я добавил сообщение «asUppercase» для отправки отдельным символам, так как нам нужно только один раз перебирать строку.

+1

Строки не являются неизменными. Символы есть. Вы можете, например, измените строку, используя #at: put :. Но вы не можете изменить получателя сообщения. –

+0

Ahh, очень верно, я думал о Java. Я исправлю свой ответ. –

Смежные вопросы