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