Как я могу проверить, определена ли переменная в Ruby? Есть ли isset
способ -типа в наличии?
ruby
reflection
Readonly
источник
источник
nil
это инициализирован.||=
оператором) ниже.defined?
все равно возвращает true для переменной, определенной в этом блоке!defined?
возвращает логическое значение?!!defined?(object_name)
Это полезно, если вы хотите ничего не делать, если он существует, но создавать его, если он не существует.
Это создает новый экземпляр только один раз. После этого он просто продолжает возвращать var.
источник
||=
с булевыми значениями, чтобы не чувствовать боль путаницы.nil
если вы действительно не хотите вычислять выражение каждый раз, когда оно вызывается, когда оно действительно возвращаетсяnil
var = (var or var.nil?)
Правильный синтаксис для приведенного выше утверждения:
подстановка (
var
) с вашей переменной. Этот синтаксис вернет значение true / false для оценки в операторе if.источник
defined?(var) == nil
?.nil?
Как говорится, использование вызова более идиоматично. Более «объектно-ориентировано» спрашивать объект, если он,nil
чем использовать оператор сравнения. Ни то, ни другое не трудно прочитать, поэтому используйте тот, который поможет вам доставить больше продукта.defined?(your_var)
будет работать. В зависимости от того, что вы делаете, вы также можете сделать что-то вродеyour_var.nil?
источник
your_var.nil?
потому что он возвращает true из false и гораздо приятнее читать и писать, чемdefined? var
. Спасибо за это.your_var.nil?
приведет к ошибке:undefined local variable or method your_var
если не определено ранее ...Попробуйте «если» вместо «если»
источник
Используйте
defined? YourVariable
Keep it simple глупо ..;)
источник
Вот некоторый код, ничего ракетостроения, но он работает достаточно хорошо
Понятно, что код раскраски не нужен, просто приятная наглядность в этом игрушечном примере.
источник
nil?
это необязательно.ПРЕДУПРЕЖДЕНИЕ Re: Общий шаблон Ruby
Это ключевой ответ:
defined?
метод. Принятый ответ выше иллюстрирует это отлично.Но под волнами скрывается акула ...
Рассмотрим этот тип общего шаблона ruby:
method2
всегда возвращаетсяnil
. Первый раз , когда вы звонитеmethod1
, то@x
переменная не установлена - поэтомуmethod2
будет работать. иmethod2
будет установлен@x
вnil
. Это хорошо, и все хорошо. Но что происходит во второй раз, когда вы звонитеmethod1
?Помните, что @x уже был установлен в ноль.
But method2
все еще будет работать снова !! Если method2 является дорогостоящим мероприятием, это может быть не то, что вы хотите.Пусть
defined?
метод придет на помощь - с этим решением, этот конкретный случай обрабатывается - используйте следующее:Дьявол кроется в деталях: но вы можете избежать этой скрывающейся акулы с помощью
defined?
метода.источник
Ты можешь попробовать:
Потому что это возвращает логическое значение.
источник
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
утверждение кажется слишком сложнымКак показывают многие другие примеры, на самом деле вам не нужно логическое значение из метода для логического выбора в ruby. Было бы плохой формой привести все к логическому значению, если вам не нужен логический тип.
Но если вам абсолютно необходимо логическое значение. Используйте! (bang bang) или «ложная ложь раскрывает правду».
Почему обычно не принуждают к принуждению:
Вот пример, где это важно, потому что оно опирается на неявное приведение логического значения к его строковому представлению.
источник
Следует отметить, что использование
defined
для проверки, задано ли определенное поле в хэше, может вести себя неожиданно:Синтаксис здесь правильный, но
defined? var['unknown']
будет оцениваться как строка"method"
, поэтомуif
блок будет выполненedit: правильная запись для проверки, существует ли ключ в хэше:
источник
Обратите внимание на различие между «определен» и «назначен».
х определяется, хотя он никогда не назначается!
источник
NameError Exception: undefined local variable or method
, и был смущен, когда единственное назначение / упоминание переменной было в блоке if, который не попадал в цель.Кроме того, вы можете проверить, определено ли оно в строке в результате интерполяции, если вы кодируете:
Система сообщит вам тип, если он определен. Если он не определен, он просто выдаст предупреждение о том, что переменная не инициализирована.
Надеюсь это поможет! :)
источник
defined?
отлично, но если вы находитесь в среде Rails, вы также можете использовать ееtry
, особенно в тех случаях, когда вы хотите проверить имя динамической переменной:источник