创建对象实例

ada*_*axa 0 ruby

两者之间有区别吗?

x = Class.new( or method)
x.method
Run Code Online (Sandbox Code Playgroud)

Class.new(or method) do |x|
x.method
end
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 6

x = SomeClass.new
x.some_method
Run Code Online (Sandbox Code Playgroud)

这首先创建一个SomeClass(initialize不带参数调用)的实例.然后它some_method在该实例上调用该方法.

SomeClass.new do |x|
  x.some_method
end
Run Code Online (Sandbox Code Playgroud)

这将创建一个实例SomeClass,initialize以块作为参数进行调用.该块接受一个参数并调用some_method该参数.块的调用次数和频率是多少以及论证的内容完全取决于SomeClass初始化方法的作用.

在许多情况下的模式

SomeClass.some_creation_method do |x|
  x.some_method
end
Run Code Online (Sandbox Code Playgroud)

使用,因此some_creation_method创建一个SomeClass实例,将其生成到块,然后在块完成后释放该实例使用的所有资源(例如,它可以关闭文件句柄,删除临时文件等).这是做什么的File.open.


在所讨论的类是字面意思的情况下,Classclass_eval在新创建的类上编辑块,即

c = Class.new do
  some_code
end
Run Code Online (Sandbox Code Playgroud)

相当于

c = Class.new
c.class_eval do
  some_code
end
Run Code Online (Sandbox Code Playgroud)