代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

==vs.==红宝石色

  •  65
  • Mads Mobæk  · 技术社区  · 14 年前

    在Ruby中,==和==之间的区别是什么?这个 RDoc

    类对象的大小写相等, 实际上与调用==, 但通常被 后代提供有意义的 case语句中的语义。

    #== 一样 == ?你能提供一个在案例陈述中何时/如何使用这个的例子吗?

    3 回复  |  直到 8 年前
        1
  •  123
  •   Jörg W Mittag    14 年前

    这两个人真的没有任何关系。特别地, #== 是相等运算符和 #=== 与平等毫无关系。就我个人而言,我觉得很不幸的是 = = 看起来很像 = = ,使用等号,通常称为 大小写相等运算符 , 三等号运算符 三等号运算符 当它真的与平等无关时。

    我打电话 = = 这个 事例包容运算符 (这是我能提出的最好的建议,我乐于接受建议,尤其是来自母语为英语的人的建议)。

    最好的描述方法 a === b 是“如果我有抽屉标签 a ,这有意义吗? b 里面呢?”

    例如, Module#=== 测试是否 b.is_a?(a) . 如果你有 Integer === 2 ,这有意义吗? 2 在一个标有 Integer ?是的,是的。怎么样 Integer === 'hello' ?显然不是。

    另一个例子是 Regexp#=== . 它测试是否匹配。这有意义吗 'hello' 在一个标有 /el+/ ?是的,是的。

    对于范围等集合, Range#=== 定义为成员资格测试:如果某个元素在集合中,则将该元素放入标有集合的框中是有意义的。

    所以,就是这样 = = 是:它测试参数是否可以包含在接收器下。

    那和什么有关 case 表达?简单的:

    case foo
    when bar
      baz
    end
    

    是一样的

    if bar === foo
      baz
    end
    
        2
  •  10
  •   sepp2k    14 年前

    是的,通过 #== 文档是指“实例方法” == 当前对象的“”。

    === 在case语句中使用,例如:

    case obj
    when x
      foo
    when y
      bar
    end
    

    是一样的

    if x === obj
      foo
    elsif y === obj
      bar
    end
    

    一些类定义自己的类 = = 范围 include? )课堂(表现得像 obj.is_a?(klass) ) Regexp (行动起来) =~ 除了返回布尔值)。有些类没有定义自己的类 = = 是数值类和字符串。

    所以

    case x
    when 0
      puts "Lots"
    when Numeric
      puts(100.0 / x)
    when /^\d+$/
      puts(100.0 / x.to_f)
    default
      raise ArgumentError, "x is not a number or numeric string"
    end
    

    是一样的

    if 0 == x
      puts "Lots"
    elsif x.is_a? Numeric
      puts(100.0 / x)
    elsif x =~ /^\d+$/
      puts(100.0 / x.to_f)
    else
      raise ArgumentError, "x is not a number or numeric string"
    end
    
        3
  •  4
  •   akuhn    8 年前

    有趣的事实, === 也用于匹配中的异常 rescue

    下面是一个例子

    class Example
      def self.===(exception)
        puts "Triple equals has been called."
        true
      end
    end
    
    raise rescue Example
    # => prints "Triple equals has been called."
    # => no exception raised
    

    这用于匹配系统错误。

    SystemCallError.=== 已定义为当两个具有相同的errno时返回true。具有相同错误号的系统调用错误,例如 Errno::EAGAIN Errno::EWOULDBLOCK 都可以通过只列出其中一个来挽救。