Проверка, определена ли переменная?

Как проверить, определена ли переменная в 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

Обратите внимание, что этот подход подходит только в том случае, если вы знаете, что ваша переменная существует, но хотите проверить, действительно ли переменная имеет какое-то значение.