Как проверить, определена ли переменная в Ruby? Существует ли способ типа isset
?
Проверка, определена ли переменная?
Ответ 1
Используйте ключевое слово defined?
(документация). Он вернет String с типом элемента или nil
, если он не существует.
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
Как скали прокомментировал: "Стоит отметить, что переменная, которая установлена в nil, инициализируется".
>> n = nil
>> defined? n
=> "local-variable"
Ответ 2
Это полезно, если вы хотите ничего не делать, если оно существует, но создайте его, если оно не существует.
def get_var
@var ||= SomeClass.new()
end
Это создает только один экземпляр. После этого он просто возвращает var.
Ответ 3
Правильный синтаксис для вышеуказанного оператора:
if (defined?(var)).nil? # will now return true or false
print "var is not defined\n".color(:red)
else
print "var is defined\n".color(:green)
end
подставляя (var
) вашу переменную. Этот синтаксис вернет значение true/false для оценки в выражении if.
Ответ 4
defined?(your_var)
будет работать. В зависимости от того, что вы делаете, вы также можете сделать что-то вроде your_var.nil?
Ответ 5
Попробуйте "если" вместо "if"
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
Ответ 6
Использовать defined? YourVariable
Держите его просто глупым..;)
Ответ 7
Вот какой-то код, ни одна ракетная наука, но он работает достаточно хорошо
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
Очевидно, что код окраски не нужен, просто хорошая визуализация в этом примере игрушек.
Ответ 8
Вы можете попробовать:
unless defined?(var)
#ruby code goes here
end
=> true
Потому что он возвращает логическое значение.
Ответ 9
Обратите внимание на различие между "определенными" и "назначенными".
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
x определяется, даже если он никогда не назначается!
Ответ 10
Как и многие другие примеры, вам действительно не нужно логическое из метода, чтобы сделать логический выбор в рубине. Было бы плохой формой, чтобы принуждать все к логическому, если вы действительно не нуждаетесь в логическом значении.
Но если вам абсолютно необходимо логическое. Используйте! (удар), или "ложная ложность раскрывает правду".
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
Почему он обычно не платит за принуждение:
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
Вот пример, где это важно, потому что он полагается на неявное принуждение булевского значения к его строковому представлению.
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
Ответ 11
Это ключевой ответ: определенный? метод. Принятый ответ выше иллюстрирует это совершенно.
Но есть акула, скрывающаяся под волнами...
Рассмотрим этот тип обычного рубинового шаблона:
def method1
@x ||= method2
end
def method2
nil
end
Остановитесь и подумайте об этом в течение секунды. метод 2 всегда возвращает nil. При первом вызове метода1 переменная @x не задана, поэтому будет запущен метод2. и метод 2 установит @x на nil. Это прекрасно, и все хорошо и хорошо. Но что происходит во второй раз, когда вы вызываете метод1?
Помните, что @x уже установлен на nil. Но метод 2 все равно будет запущен снова? Если метод2 является дорогостоящим предприятием, это может быть не то, что вам нужно.
Пусть заданный? метод приходит на помощь
def method1
return @x if defined? @x
@x = method2
end
Если вы не знали об этом трюке, тогда "вам понадобится большая лодка".
Ответ 12
Следует отметить, что использование defined
для проверки того, установлено ли определенное поле в хеше, может показаться неожиданным:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
Здесь синтаксис верен, но defined? var['unknown']
будет оцениваться по строке "method"
, поэтому блок if
будет выполнен
Ответ 13
Кроме того, вы можете проверить, определено ли это в строке с помощью интерполяции, если вы код:
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
Система сообщит вам тип, если он определен. Если он не определен, он просто вернет предупреждение о том, что переменная не инициализирована.
Надеюсь, это поможет!:)
Ответ 14
Я хотел проверить, были ли переменные определены в моей модели Rails, но некоторые переменные были определены как тривиальные пустые строки "".
Простейшим решением было проверить, была ли длина переменной >= 1:
if variable.length >= 1
doSomething
Обратите внимание, что этот подход подходит только в том случае, если вы знаете, что ваша переменная существует, но хотите проверить, действительно ли переменная имеет какое-то значение.