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