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')
如果我将代码更改为
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 :(得分:1)
=~
运算符会在String
和Regexp
匹配时返回第一个匹配索引,否则会返回nil
:
'foo' =~ /bar/ # => nil
'foo bar' =~ /bar/ # => 4
答案 1 :(得分:0)
使用if / else语句的第一个方法是将=~
检查的结果视为“ truthy值?”。如果在字符串中找到匹配项,则返回索引(在您的情况下为0
),如果未找到,则返回nil
。
0
是一个真正的价值; nil
不是。
因此,即使它在包含/.../ =~ s
表达式的每个方法中返回相同的结果,您也会从方法中获得不同的返回值,具体取决于您对该结果的处理方式。
在if / else语句中,如果true
为真值,则为0
; false
为nil
的非真实值。{ / p>
在裸返回语句中,您获得0
和nil
的普通返回值。
答案 2 :(得分:0)
答案 3 :(得分:0)
puts starts_with_consonant?('aa').inspect
打印出0(不应该是1?)
不,它应该是0
。字符串是零索引的,该模式已在第零个位置找到。 0
是一个真值,如果在那里进行评估,则会触发if
子句。 'da' =~ /a/
将返回1
,因为a
是字符串中的第一个字符(d
为0)。
puts starts_with_consonant?('da').inspect
打印出nil
没有与模式匹配的位置,因此返回值为nil
,这是一个假值,如果被评估为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
。
答案 4 :(得分:0)
你回来了。你不能打印它,但你可以使用它,例如
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