2011-01-26 136 views
0

创建对象实例

x = Class.new(or method) 
x.method 

Class.new(or method) do |x| 
x.method 
end 
+1

当你说`Class.new`时,你的字面意思是`Class.new`还是你使用`Class`作为实际类的占位符? – sepp2k 2011-01-26 20:09:48

回答

1

之间的差别取决于类。例如对于File对象,

File.open("foo.txt", "wb") do |f| 
    f.write("x") 
end 

当块退出时,文件句柄将自动关闭。但这只是习惯用法,通常这个类定义了语义,并且选择它是否为块提供变体。

6
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 
1

这里是一个简单的例子表明这两者不相同。如果您的课程的initialize方法最后名为yield(self),它们只会相当。

class MyClass 
    def initialize(name) 
    @name = name 
    end 
    def say_hi 
    puts "Hi, I am #{@name}" 
    end 
end 

x = MyClass.new("Bob") 
x.say_hi 
#=> Hi, I am Bob 

MyClass.new("Jim") do |x| 
    x.say_hi 
end 
#=> (nothing prints out) 

在第二个例子中,我传递一个块new,但因为我的initialize方法不会做的事情块,块的内容永远不会运行。