Троичное выражение с " определено?"возвращает" expression " вместо value?

Я довольно новичок в Ruby и Rails, но даже после поиска переполнения стека и google я не мог найти ответ на это.

у меня есть простая рубиновая стенография if, которая должна возвращать integer вот так:

# in the context of this erb document `amount` is defined as 5.
@c = ( defined? amount ? amount : r( 1,4 ) )

r() пользовательский вспомогательная функция, которая возвращает случайное число между в этом случае 1 и 4.

то, как я намерен это работать, это if amount определено, затем используйте число, определенное как amount, else сгенерировать случайное число между 1 и 4 и использовать его вместо.

при печати @c однако выходы Ruby expression вместо числа.

что я должен сделать, чтобы заставить это работать, как я намеревался, и что я делаю неправильно?

большое спасибо за прочтение!

3 ответов


defined? - это привязка к amount ? amount : r(1,4) таким образом, это эквивалентно:

defined?(amount ? amount : r(1,4))

вы, вероятно, хотите:

defined?(amount) ? amount : r(1,4)

на самом деле, шансы, что amount || r(1,4) или amount.nil? ? r(1,4) : amount лучше бы соответствовать тому, что вы хотите, так как я думаю, что вы не хотите этого:

1.9.3p194 :001 > defined?(amount)
 => nil 
1.9.3p194 :002 > amount = nil
 => nil 
1.9.3p194 :003 > defined?(amount)
 => "local-variable" 

...в таком случае @c будет nil - значение определенной переменной.


использовать || оператора в этом случае:

@c = amount || r (1,4)

в коде тег defined? способ работает на amount ? amount : r( 1,4 ) а не просто amount как вы задумали. Кроме того,defined? оператор, вероятно, не делать то, что вы ожидаете, взгляните на это запись в блог чтобы получить представление.


вы ищете оператор коалесцирования null. Попробуйте это:

@c = amount || r(1,4)

этот код назначит сумму @c, если сумма определена. Если нет, то результат r(1,4) будет присвоен @c.

http://eddiema.ca/2010/07/07/the-null-coalescing-operator-c-ruby-js-python/