2012-05-05 6 views
1

Я искал метод to_ary класса Array. Я смущен, как метод относится к исходному документу.Ошибка путаницы Ruby to_ary

метод to_ary => Возвращает

и настраивает

Если я это сделать:

1.9.3-p0 :013 > a = [1,33,42] 
=> [1, 33, 42] 
1.9.3-p0 :014 > a.to_ary 
=> [1, 33, 42] 
1.9.3-p0 :015 > a 
=>[1, 33, 42] 

Почему атрибут статичным VALUE необходимо? Является VALUE ретривером? Пространство (вместо запятой) между аргументами означает, что вторым аргументом является метод, вызываемый приемником?

static VALUE 

rb_ary_to_ary_m(VALUE ary) 
{ 
    return ary; 
} 

Бест,

cj3kim

+0

'static VALUE' объявляет, что функция возвращает' VALUE', но по мере того, как @LBg происходит, это все C. – Ashe

ответ

2

Это код C. Интерпретатор Ruby написан на языке C. В этом коде первый аргумент используется как self. Эквивалент в рубин будет:

def to_ary 
    return self 
end 
+0

Спасибо за ваш ответ! – cj3kim

1

Что происходит здесь в том, что он обрабатывает его как массив и IRB использует метод печати, чтобы вытолкнуть на экран. Print преобразует to_ary в строку, поэтому вы не увидите никакой разницы, вы увидите разницу при использовании puts. В фоновом режиме использует to_ary, тогда как печать использует to_s.

Метод to_ary предназначен для неявных преобразований, а to_a предназначен для явного преобразования. Хорошим примером является метод flatten, который принимает многомерный массив и выравнивает его в единичный размерный массив. Если вы не используете опасный метод, фактическая переменная остается прежней, когда вы продолжаете использовать метод конкатенации метода сглаживания. Это связано с тем, что flatten использует to_ary, а не to_a, тогда как flatten! использует to_a. to_ary рассматривает его как массив для этого экземпляра, но не изменяет постоянную переменную.

Смежные вопросы