Некоторые сомнения относительно оператор короткого замыкания (||=)

Я заметил интересное использование ||=, как показано ниже:

Код 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 в этом методе, если только вы не использовали ключевое слово 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