2014-11-14 2 views
1
def starts_with_consonant?(s) 
    if /^(a|e|i|o|u).*/i =~ s 
    true 
    else 
    false 
    end 
end 

# prints out true 
puts starts_with_consonant?('aa') 

# prints out false 
puts starts_with_consonant?('da') 

Если изменить код толькоRuby = = оператор возвращает значения?

def starts_with_consonant?(s) 
    /^(a|e|i|o|u).*/i =~ s 
end 

Это же функциональность, потому что

puts starts_with_consonant?('aa').inspect 

печатает 0 (Если не было бы 1?)

puts starts_with_consonant?('da').inspect 

отпечатки nil

# both print out 0 
puts starts_with_consonant?('aa').to_i 
puts starts_with_consonant?('da').to_i 

Что дает?

+0

Не был бы «начинается с согласной» регулярное выражение выглядеть как '/^[б-ДФ-HJ-np- тВ-г]/i'? – Kimball

ответ

0

Ваш первый метод, с инструкцией if/else, обрабатывает результат проверки =~ как «правдивое значение или нет?». Если совпадение найдено в строке, оно возвращает индекс (в вашем случае, 0), или если он не найден, он возвращает nil.

0 - достоверное значение; nil нет.

Поэтому, несмотря на то, что он возвращает один и тот же результат в каждом из ваших методов, содержащих выражение /.../ =~ s, вы получаете разные возвращаемые значения из методов, в зависимости от того, что вы делаете с этим результатом.

В, если/другое заявление, вы получите true когда это truthy значение 0 и false, когда это не-truthy значение nil.

В операторе голого возврата вы получаете равные возвращаемые значения 0 и nil.

0

метод #=~ фактически возвращает индекс, в котором встречается первое совпадение.

Вы не можете сделать nil.to_i, потому что это производит нуль.

[6] pry(main)> nil.to_i 
=> 0 
0
puts starts_with_consonant?('aa').inspect 

печатает 0 (Если не было бы 1?)

Нет, это должно быть 0. Строки нулевые индексы, шаблон найден в нулевой позиции. 0 является правдивым значением, вызывая предложение if, если оценивается там. 'da' =~ /a/ вернется 1, так как a - 1-й символ в строке (d - 0-й).

puts starts_with_consonant?('da').inspect 

распечатывает нильполугруппу

Там нет позиции, что соответствует шаблону, так что возвращаемое значение nil, falsy значение, которое вызывает пункт else если оценивать как if состояния.

# both print out 0 
puts starts_with_consonant?('aa').to_i 
puts starts_with_consonant?('da').to_i 

Так как 0.to_i и nil.to_i результата в 0.

1

=~ оператор возвращает первый индекс соответствия, если матч String и Regexp, в противном случае nil возвращается:

'foo' =~ /bar/ # => nil 

'foo bar' =~ /bar/ # => 4 
0

Ваше возвращение truthy. Вы не можете распечатать его, но вы можете использовать его, например.

2.0.0-p247 :007 > if "aaaabcd" =~ /a/ then puts "true" end 
true 
=> nil 

2.0.0-p247 :008 > if "aaaabcd" =~ /aaa/ then puts "true" end 
true 
=> nil 

2.0.0-p247 :009 > if "aaaabcd" =~ /z/ then puts "true" end 
=> nil 

Аналогично вы можете установить переменную на основе оценки, т.е.

2.0.0-p247 :013 > if "aaaabcd" =~ /a/ then b=1 end 
=> 1 

2.0.0-p247 :014 > if "aaaabcd" =~ /aaa/ then b=1 end 
=> 1 

2.0.0-p247 :015 > if "aaaabcd" =~ /zzz/ then b=1 end 
=> nil 
Смежные вопросы