Q
创建对象实例
0
A
回答
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
方法不会做的事情块,块的内容永远不会运行。
相关问题
- 1. mysqli_fetch_object时创建新的对象实例
- 2. 在实例对象中创建JFrame
- 3. 使用新词创建对象实例
- 4. Java创建地图对象的实例
- 5. 创建新的实例对象
- 6. 如何创建对象的实例?
- 7. Java对象实例创建问题
- 8. 全局创建对象实例
- 9. Asp.net MVC4,C#创建对象实例
- 10. Java创建深空对象的实例
- 11. 的Flex对象创建一倍实例
- 12. 如何基于对象名称创建javascript对象的实例
- 13. 在注入对象时强制创建对象的新实例
- 14. 无法实例化对象:只创建第一个对象
- 15. 新阵列(_)填充(对象)不创建对象的新实例
- 16. 从实物创建ASMX存根对象的一个实例
- 17. 创建实例
- 18. 创建实例
- 19. 创建实例
- 20. 我如何获得在php中创建另一个对象实例的实例?
- 21. 创建一个对象的新实例,或修改现有的实例?
- 22. 创建createjs对象的新实例每次都返回相同的实例
- 23. 无法创建抽象类的实例
- 24. 对象实例没有新建?
- 25. 创建不同的对象实例列表,并使用这些对象
- 26. Javascript:从已经实例化的对象创建对象与原型
- 27. Django 1.9更新模型对象创建一个新对象实例
- 28. 什么时候创建第一个Python对象的“对象”和“类型”实例?
- 29. 有没有办法获得创建另一个对象的对象的实例?
- 30. Node.js对象实例是否为每个用户创建一个对象?
当你说`Class.new`时,你的字面意思是`Class.new`还是你使用`Class`作为实际类的占位符? – sepp2k 2011-01-26 20:09:48