Ruby中定义的“ +”方法在哪里?

时间:2018-09-28 08:59:09

标签: ruby

+是一种方法。

5 + 3 #=> 8
5.+(3) #=> 8

有人可以告诉我+的方法定义吗?

3 个答案:

答案 0 :(得分:4)

以下是Integer#+的2.5.0版本:

      VALUE
rb_int_plus(VALUE x, VALUE y)
{
    if (FIXNUM_P(x)) {
        return fix_plus(x, y);
    }
    else if (RB_TYPE_P(x, T_BIGNUM)) {
        return rb_big_plus(x, y);
    }
    return rb_num_coerce_bin(x, y, '+');
}

在文档中通常很容易找到它:

https://ruby-doc.org/core-2.5.0/Integer.html#method-i-2B

请紧记JörgW Mittag指出的内容-有许多+方法,例如,+文字返回的内容定义的方法4.4会有所不同,因为它们是{{ 1}},而不是Float

您可能还已经注意到它是C,而不是Ruby。这是因为Ruby解释器MRI是用C编写的,因此,难怪该语言的核心功能(如Integer类及其方法)也是用C编写的。

答案 1 :(得分:2)

仅供参考,有一个gem在shell中提供了Ruby的文档/源代码:pry-doc

它是pry(另一个红宝石外壳)的插件

这非常有用,每天对我都有帮助。我真的建议将其用于任何红宝石项目。

您的案例非常特殊,让我很头疼,试图获取+方法的源代码。我了解到,在寻找运算符(+-==<<,...)源代码或文档时,您必须放置{{1} }放在运算符前面。

示例

.

以下是如何在您的情况下使用它

pry(main)> ? [].==

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: ==(arg1)
Number of lines: 7

Equality --- Two arrays are equal if they contain the same number of elements and if each element is equal to (according to Object#==) the corresponding element in other_ary.

   [ "a", "c" ]    == [ "a", "c", 7 ]     #=> false

答案 2 :(得分:1)

Here is the implementation in Opal

def +(other)
  %x{
    if (other.$$is_number) {
      return self + other;
    }
    else {
      return #{__coerced__ :+, other};
    }
  }
end

您可能已经注意到,它是带有嵌入式ECMAScript的Ruby,而后者又嵌入了Ruby。 Opal是ECMAScript平台的编译器,因此出于性能原因,一些低层方法在ECMAScript中部分实现。