Где метод '+' определен в Ruby? - PullRequest
0 голосов
/ 28 сентября 2018

+ - это метод.

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

Может кто-нибудь показать мне определение метода +?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вот реализация в Opal :

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

Возможно, вы заметили, что это Ruby со встроенным ECMAScript, в который в свою очередь встроен Ruby.,Opal является компилятором для платформы ECMAScript, поэтому некоторые низкоуровневые методы частично реализованы в ECMAScript по соображениям производительности.

0 голосов
/ 28 сентября 2018

Просто для вашей информации есть гем, который предоставляет документацию / исходный код для Ruby в оболочке: pry-doc

Это плагин для pry (еще одна рубиновая оболочка)

Это очень полезно и помогает мне каждый день.Я действительно рекомендую это для любого проекта ruby.

Ваш случай довольно специфичен и вызвал головную боль при попытке получить источник метода +.Я узнал, что при поиске исходного кода или документации оператора (+, -, ==, <<, ...) вы должны поставить . перед оператором.

Пример

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, '+');
    }
}
0 голосов
/ 28 сентября 2018

Вот источник 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

Имейте в виду, на что указывал Йорг В. Миттаг - существует ряд методов + и, например, метод +, определенныйна том, что возвращает 4.4, литерал будет отличаться, потому что это Float, а не Integer.

Вы также, возможно, заметили, что это C, а не Ruby.Это потому, что интерпретатор Ruby, MRI, написан на C, поэтому неудивительно, что основные функции этого языка (например, Integer класс и его методы) также написаны на C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...