2013-06-21 2 views
0

Метод defined? дает результат для стенографического выражения, заданного в качестве аргумента. Например, результатИспользование `defined?` При одноуровневом расширении

defined? foo 

чувствителен ли foo буквально любой определяется переменной/метод. Он не делает разницы, является ли foo определяется как строка, которая является действительным (существующим) выражение:

foo = "Array" 

или нет:

foo = "NonExistingConstant" 

Можно ли сделать defined? быть чувствительным к данному аргументу расширен один уровень? То есть, для foo = "Array", он должен вернуть "constant" и для foo = "NonExistingConstant", он должен вернуть nil. Если да, то как?

+0

вы собираетесь проверить только константы? 'const_get', может быть? –

+0

@ Сергио Туленцев Да. Ваша догадка правильная. Я на самом деле использую 'const_get', но хочу, чтобы это условие было оценено только при наличии такой константы. Я использую 'rescue' сейчас, но хотел сделать это без него. – sawa

ответ

2

Так как вам нужно проверить только константы:

['Array', 'NonExistentClass'].each do |name| 
    puts Object.const_defined?(name) 
end 
# >> true 
# >> false 
+0

Спасибо. Это то, чего я хотел. Я этого не знал. – sawa

+0

Моя проблема решена, но только для любопытства: поскольку существует 'const_defined?', Я полагаю, что нет общего типа 'expression_defined?'. Интересно, почему дословный «определенный?» Для общего назначения, и те, которые принимают строку типа «const_defined?» (И другие подобные), более конкретны. – sawa

+0

Хорошо. Кажется, у меня есть ответ на мой комментарий выше. Он сочетается с методами, которые их оценивают. Поскольку существует общий 'eval' /' exec', общий 'defined?' Был бы полезен. И поскольку существуют определенные методы, такие как 'const_get', полезны специальные методы проверки, такие как' const_defined? '. Или, я не знаю. Может быть, это не имеет смысла. – sawa