ruby' s =〜运算符返回值?

时间:2014-11-14 00:08:39

标签: ruby

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

是什么给出了?

5 个答案:

答案 0 :(得分:1)

=~运算符会在StringRegexp匹配时返回第一个匹配索引,否则会返回nil

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

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

答案 1 :(得分:0)

使用if / else语句的第一个方法是将=~检查的结果视为“ truthy值?”。如果在字符串中找到匹配项,则返回索引(在您的情况下为0),如果未找到,则返回nil

0是一个真正的价值; nil不是。

因此,即使它在包含/.../ =~ s表达式的每个方法中返回相同的结果,您也会从方法中获得不同的返回值,具体取决于您对该结果的处理方式。

在if / else语句中,如果true为真值,则为0; falsenil的非真实值。{ / p>

在裸返回语句中,您获得0nil的普通返回值。

答案 2 :(得分:0)

好的#=~方法实际上返回了第一次匹配发生的索引。

你不能nil.to_i,因为它会产生零。

[6] pry(main)> nil.to_i
=> 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_inil.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