Някои съмнения w.r.t. късо съединение (||=) оператор

Забелязах някакво интересно използване на ||= както по-долу -

Код 1

array_1 ||= begin
    (1..5).to_a.map {|el| el*10}
end
puts array_1.to_s # [10,20,30,40,50]

Така че изпълних следната му модифицирана версия -

Код 2

array_2 ||= def some_method
    (1..5).to_a.map {|el| el*10}
end
puts array_2 # prints nothing
puts array_2.class # NilClass
puts some_method.to_s # [10,20,30,40,50]
  1. Защо array_2 се инициализира към nil?
  2. Възможно ли е да се извика some_method с помощта на array_2 обект? как

АКТУАЛИЗИРАНЕ

Това направих за въпрос 2

array_2 ||= "We've got #{def some_method;(1..5).to_a.map {|el| el*10};end;array_2.send(:some_method)}"
puts array_2 # We've got [10, 20, 30, 40, 50]

person saihgala    schedule 15.10.2012    source източник


Отговори (2)


Върнатата стойност на израз за дефиниране на метод (def) е дефинирана от изпълнението. Повечето реализации на Ruby просто връщат nil от def израз, но Rubinius, например, връща компилирания код на метода, обвит в CompiledMethod обект.

person Jörg W Mittag    schedule 15.10.2012
comment
Добре, това отговаря на nil задача. И има ли някакъв начин да се инициализира array_2 до some_method's върната стойност, без изрично да се прави нещо като array_2 = some_method - person saihgala; 15.10.2012

Когато декларирате който и да е метод, той просто ще върне nil, но когато извикате който и да е метод, той ще върне o/p на връщането на последния ред в този метод, освен ако не сте използвали ключова дума return.

Следното трябва да работи за вас

def some_method
    return (1..5).to_a.map {|el| el*10}
end

array_2 ||=some_method
person Salil    schedule 15.10.2012
comment
Аз разбирам, че. Това, което търся, е някакъв хак/един ред, който декларира метода, извиква го и връща изхода му с един изстрел? - person saihgala; 15.10.2012
comment
това ще даде грешка, защото извиквате some_method преди да е дефиниран - person saihgala; 15.10.2012
comment
Въпреки това реших нещо подобно array_2 ||= "We've got #{def some_method;(1..5).to_a.map {|el| el*10};end;array_2.send(:some_method)}" - person saihgala; 15.10.2012