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

Ruby中定义的“+”方法在哪里?,ruby,Ruby,+这是一种方法 5 + 3 #=> 8 5.+(3) #=> 8 有人能告诉我+”的方法定义吗?这是2.5.0版Integer+的来源: 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

+这是一种方法

5 + 3 #=> 8
5.+(3) #=> 8
有人能告诉我+”的方法定义吗?

这是2.5.0版Integer+的来源:

      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, '+');
}
通常很容易在文档中找到它:

请记住Jörg W Mittag所指出的-有许多+方法,例如,在4.4 literal返回的内容上定义的method+将有所不同,因为它是浮点,而不是整数

您可能也注意到它是C,而不是Ruby。这是因为Ruby解释器MRI是用C编写的,所以难怪这种语言的核心函数如Integer类及其方法也是用C编写的。

:


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

仅供参考,有一个gem为Ruby in shell提供了文档/源代码:

它是另一个ruby外壳的插件

它非常有用,每天都帮助我。我真的推荐它用于任何ruby项目


您的案例非常特殊,在获取+方法源代码时让我头疼。我了解到,当寻找运算符+,-,==,哪一个?核心库中有七种不同的+定义,标准库中有更多,第三方库和gems中有无数种。另外,您在谈论哪种实现?Rubinius、YARV、MRuby、JRuby、IronRuby、MagLev、Opal、Topaz……都有不同的核心库实现。如果您要查找整数。可能不是很有用。你能具体地问一下你想知道什么,这样我们才能更有帮助吗?
def +(other)
  %x{
    if (other.$$is_number) {
      return self + other;
    }
    else {
      return #{__coerced__ :+, other};
    }
  }
end
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
[1] pry(main)> x = 5
=> 5
[2] pry(main)> show-source x.+

From: numeric.c (C Method):
Owner: Integer
Visibility: public
Number of lines: 11

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, '+');
}


[3] pry(main)> x = 5.0
=> 5.0
[4] pry(main)> $ x.+

From: numeric.c (C Method):
Owner: Float
Visibility: public
Number of lines: 16

static VALUE
flo_plus(VALUE x, VALUE y)
{
    if (RB_TYPE_P(y, T_FIXNUM)) {
  return DBL2NUM(RFLOAT_VALUE(x) + (double)FIX2LONG(y));
    }
    else if (RB_TYPE_P(y, T_BIGNUM)) {
  return DBL2NUM(RFLOAT_VALUE(x) + rb_big2dbl(y));
    }
    else if (RB_TYPE_P(y, T_FLOAT)) {
  return DBL2NUM(RFLOAT_VALUE(x) + RFLOAT_VALUE(y));
    }
    else {
  return rb_num_coerce_bin(x, y, '+');
    }
}