x = SomeClass.new
x.some_method
Сначала создается экземпляр SomeClass
(вызывается initialize
без аргументов). Затем он вызывает метод some_method
для этого экземпляра.
SomeClass.new do |x|
x.some_method
end
Это создает экземпляр SomeClass
, вызывающий initialize
с блоком в качестве аргумента. Этот блок принимает один аргумент и вызывает some_method
для этого аргумента. Будет ли блок вызываться и как часто будет вызываться этот аргумент, и от того, каким будет аргумент, целиком зависит от того, что делает метод инициализации SomeClass
.
Во многих случаях шаблон
SomeClass.some_creation_method do |x|
x.some_method
end
используется, так что some_creation_method
создает экземпляр SomeClass
, возвращает его в блок и затем освобождает все ресурсы, используемые этим экземпляром после завершения блока (например, он может закрывать дескрипторы файлов, удалять временные файлы и т. Д. ). Это то, что File.open
делает.
В случае, когда рассматриваемый класс буквально Class
, блок будет class_eval
редактироваться для вновь созданного класса, то есть
c = Class.new do
some_code
end
эквивалентно
c = Class.new
c.class_eval do
some_code
end