Троичное выражение с " определено?"возвращает" 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/