【问题标题】:ruby's =~ operator return values?ruby 的 =~ 运算符返回值?
【发布时间】:2014-11-14 08:19:50
【问题描述】:
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

什么给了?

【问题讨论】:

  • “以辅音开头”的正则表达式不会看起来更像/^[b-df-hj-np-tv-z]/i吗?

标签: ruby


【解决方案1】:

如果StringRegexp 匹配,则=~ 运算符返回第一个匹配索引,否则返回nil

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

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

【讨论】:

    【解决方案2】:

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

    0 是一个真值; nil 不是。

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

    在 if/else 语句中,true0 的真值,falsenil 的非真值。

    在简单的 return 语句中,您会得到 0nil 的普通返回值。

    【讨论】:

      【解决方案3】:

      #=~ 方法实际上返回第一个匹配项的索引。

      你不能这样做 nil.to_i 因为那会产生零。

      [6] pry(main)> nil.to_i
      => 0
      

      【讨论】:

        【解决方案4】:
        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,这是一个假值,如果评估为if 条件,则会触发else 子句。

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

        因为0.to_inil.to_i 都会导致0

        【讨论】:

          【解决方案5】:

          你真的回来了。你不能打印它,但你可以使用它,例如

          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 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-01
            • 2013-07-31
            • 2019-12-29
            • 1970-01-01
            • 1970-01-01
            • 2016-07-14
            • 1970-01-01
            • 2012-01-24
            相关资源
            最近更新 更多