代码之家  ›  专栏  ›  技术社区  ›  ryeguy

integer==3如何工作?

  •  4
  • ryeguy  · 技术社区  · 16 年前

    据我所知, === 操作员测试rhs对象是否为lhs对象的成员。这是有道理的。但这在Ruby中是如何工作的呢?我在看Ruby文档,我只看到 = = 定义在 Object ,我看不到 Integer 本身。只是没有记录?

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

    Integer 是一个类,它(至少在Ruby中)意味着它和其他对象一样,只是一个无聊的老标准对象,恰好是 Class 类(而不是, Object String MyWhateverFoo )

    等级 反过来又是 Module (虽然可以说不应该,因为它违反了里斯科夫的替代原则,但这是另一个论坛的讨论,也是一匹已经被多次击败的死马)。而在 Module#=== 你会找到你想要的定义 等级 继承自 模块 以及 等级 (像 整数 理解。

    模α=== 基本上定义为对称 Object#kind_of? 它回来了 true 如果它的参数是自身的一个实例。所以, 3 是的实例 整数 因此 Integer === 3 收益率 ,正如 3.kind_of?(Integer) 会。

    据我所知, === 操作员测试rhs对象是否为lhs对象的成员。

    不一定。 = = 是一种方法,就像其他方法一样。它做我想做的任何事。在某些情况下,“是成员”的类比会失效。在这种情况下,已经很难接受了。如果你是一个硬核类型理论的怪人,那么把一个类型看作一个集合,把这个类型的实例看作一个集合的成员是完全自然的。当然还有 Array Hash “成员”的定义也很明显。

    但是呢? Regexp ?同样,如果你是正式语言爱好者,并且向后了解你的chomsky,那么解释一个 正则表达式 作为一组无限的单词和 S作为这组成员感觉完全自然,但如果不是,那听起来有点奇怪。

    到目前为止,我还没有对 准确地说 什么 = = 手段。事实上,我甚至没有想出一个好名字。它通常被称为 三等号运算符 , 三等号运算符 大小写相等运算符 但是我非常不喜欢这些名字,因为它与平等毫无关系。

    那么,它是做什么的?我想到的最好的方法是:假设您正在创建一个表,其中一个列标题是 整数 . 写东西有意义吗 在那个专栏里?如果列标题之一是 /ab*a/ ,写作是否有意义? 'abbbba' 在那个栏目里?

    根据这个定义,它可以称为 包容算子 但这比其他例子更糟…

        2
  •  3
  •   John Hyland    16 年前

    它是在模块上定义的,哪个类是的子类,哪个整数是的实例。

    换句话说,当你跑步时 Integer === 3 ,您正在对常量integer引用的对象调用“==”(带有参数3),该常量integer是名为class的类的实例。因为类是模块的子类,并且没有定义它自己的 === 在模块上定义了==的实现。

    查看 API docs for Module 更多信息。

        3
  •  -1
  •   ceri    16 年前

    整数是对象的一个子类。

    推荐文章