2012-04-20 5 views
0

Я новичок в Ruby и наткнулся на оператора defined?. Я думал, что ? подразумевает, что метод возвращен true/false, но defined? возвращает описание идентификатора, если оно определено.Ruby Программирование: Методы предикатов

Я знаю, что есть компонент true/false в том, что идентификатор или не определен, но я думал, что ? означает, что возвращаемое значение всегда должно было быть true/false`. Помогите?

ответ

4

Он возвращает «правдивое» значение, которое либо «правдиво-истинное», либо «правдиво-ложное».

В Ruby есть только две вещи, которые являются truthy-ложь:

  • false (одноэлементный объект)
  • nil (одноэлементный объект)

Все иначе считается правдоподобным. Тонны кода Ruby используют этот факт для предикатов. Проверки предикатами, как таковое, должно быть:

if list.empty? 

нет:

if list.empty? == true 
+0

ах имеет смысл. Благодарю. –

0

Это только соглашение, а не часть языка, поэтому нет фактического правила, касающегося вопросительных знаков. От http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/

«По соглашению методы, отвечающие на вопросы (т. Е. Array # empty? Возвращает true, если приемник пуст) заканчиваются вопросительными знаками».

0

"не-ноль"/ноль такой же, как истина/ложь в Ruby. Если вы пришли с другого языка, у вас может быть эта привычка тестировать, используя true/false, но в Ruby мы проверяем, является ли объект нулевым или нет.

так что эти два одинаковы:

a = 'hello' 
if defined?(a) then puts a end 

a = 'hello' 
if defined?(a) != nil then puts a end 

Если вы настаиваете вы хотите вернуть истина/ложь, вы можете использовать второй. Это будет возвращать истина/ложь:

a != nil 
2
defined? a #=> nil 
a = 7   # => 7 
defined? a #=> "local-variable" 

В то время как он не проходит действительные «истинные» или «ложные» ценности она все еще функционирует таким же образом.

if defined? a 
    puts "This will still act as true" 
end 
    #=> This will still act as true 

Причина этого в том, что в рубине ВСЁ правда, за исключением false и nil.

У этого link есть намного больше информации о defined?.

0

Оператор defined? возвращает nil, если его аргумент (который может быть произвольным выражением) не определен, в противном случае он возвращает описание этого аргумента.

И поскольку nil оценивает значение false и (кроме false), все остальные выражения оцениваются как true, поведение defined? такое же, как и ожидалось.

Смежные вопросы