Проверьте, определена ли переменная вне блока - PullRequest
1 голос
/ 19 сентября 2010

Предположим, у нас есть n констант, таких как:

FOO = 'foo'
BAR = 'bar'
...

Мне нужно проверить в блоке, существуют ли они и не пусты ли.

Ответы [ 3 ]

3 голосов
/ 19 сентября 2010

Это лучший способ, на мой взгляд:

[:FOO, :BAR, :FOOBAR].each do |i|
    raise "constant #{i} not defined" unless Object.const_defined?(i)

    puts "constant #{i} exists and has value #{Object.const_get(i)}"
end

РЕДАКТИРОВАТЬ:

Все немного сложнее, если вы хотите искать константы с учетом области видимости (т.е. не только константы верхнего уровня):

def const_receiver
    is_a?(Module) ? self : class << self; self; end
end

[:FOO, :BAR, :FOOBAR].each do |i|
    raise "constant #{i} not defined" unless const_receiver.const_defined?(i)

    puts "constant #{i} exists and has value #{const_receiver.const_get(i)}"
end
0 голосов
/ 19 сентября 2010

В вашем исходном коде i - это строка, поэтому она не будет пустой.

Полагаю, вы проверяете, является ли константа с именем i пустой, верно? Это не труба.

%w(FOO BAR FOOBAR).each do |const_name|
  raise "#{const_name} is missing or empty" if (! eval("defined?#{const_name}") || eval(const_name).empty?)
end

Примечания:

  • Я переименовал i в const_name
  • Ruby имеет тенденцию использовать raise вместо fail
  • У вас есть немало логики в одной строке. Я хотел бы разбить его на две строки: одна проверка, существует ли константа, и одна проверка, является ли строка, на которую ссылается константа, пустой. А еще лучше, сделайте это методом.
  • Многострочные блоки, как правило, используют do ... end, а не { ... } (это больше для отдельных строк. Однако я думаю, что СО сравнивает эти два вопроса - стоит посмотреть, потому что две формы не полностью идентичны )

Из любопытства, какой язык программирования вы использовали перед использованием Ruby? Это был Perl?

0 голосов
/ 19 сентября 2010
BAR = 'bar'
%w(FOO BAR FOOBAR).each {|i|
  begin
    eval(i)
  rescue NameError=>e
    puts e
  end
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...