Ruby: в чем ловушка в этом простом фрагменте кода, который проверяет существование переменной - PullRequest
0 голосов
/ 09 апреля 2010

Я начинаю с Ruby, и, делая несколько тестовых примеров, я наткнулся на ошибку в коде, которую я не понимаю, почему это происходит.

Код претендует на тестирование, если переменная finn определена? () И если она определена, то она увеличивает ее. Если он не определен, он определит его со значением 0 (ноль). Когда код выдал ошибку, я начал разбивать ее на маленькие части и запускать, чтобы лучше отследить, откуда произошла ошибка. Код был запущен в IRB irb 0.9.5 (05.04.13), используя ruby ​​1.9.1p378

Сначала я подтверждаю, что переменная finn еще не определена, и все в порядке:

?> finn
NameError: undefined local variable or method `finn' for main:Object
        from (irb):134
        from /home/paulo/.rvm/rubies/ruby-1.9.1-p378/bin/irb:15:in `<main>'
>>

Затем я подтверждаю, что следующее встроенное условие выполняется должным образом, и все в порядке:

?> ((defined?(finn)) ? (finn+1):(0))
=> 0

А теперь приходит код, который выдает ошибку:

?> finn=((defined?(finn)) ? (finn+1):(0))
NoMethodError: undefined method `+' for nil:NilClass
        from (irb):143
        from /home/paulo/.rvm/rubies/ruby-1.9.1-p378/bin/irb:15:in `<main>'

Я ожидал, что код не выдаст никакой ошибки, и что после выполнения переменная finn будет определена с первым значением 0 (ноль). Но вместо этого код выдает ошибку, и finn определяется, но со значением nil.

>> finn
=> nil

Откуда может появиться ошибка?!? Почему встроенное условие работает само по себе, но не при использовании для присваивания финну?

Любая помощь приветствуется:)

Ответы [ 2 ]

3 голосов
/ 09 апреля 2010

В этой строке

finn=((defined?(finn)) ? (finn+1):(0))

Когда вы пишете finn=, он объявляет finn и устанавливает его в ноль, пока не произойдет присваивание. Следовательно, defined?(finn) возвращает true, поэтому он пытается выполнить finn+1, что эквивалентно nil+1, что приводит к NoMethodError, который вы упомянули выше.

Возможно, вы ищете это:

finn ||= 0
finn += 1
1 голос
/ 09 апреля 2010

Джон прав. попробовать:

finn = finn ? finn + 1 : 0
...