2011-01-26 5 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

+0

私は実際のクラスを意味します。たとえば、File.open() – adaxa

答えて

1

違いがあり、クラスに依存します。例えばFileオブジェクトの場合、

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

ブロックが終了すると、ファイルハンドルは自動的に閉じられます。しかし、これは慣用法にすぎません。一般に、クラスはセマンティクスを定義し、バリアントにブロックを提供するかどうかを選択します。

6
x = SomeClass.new 
x.some_method 

この最初は(引数なしでinitializeを呼び出す)SomeClassのインスタンスを作成します。次に、そのインスタンスのメソッドsome_methodを呼び出します。

SomeClass.new do |x| 
    x.some_method 
end 

これは、引数としてブロックでinitializeを呼び出し、SomeClassのインスタンスを作成します。そのブロックは1つの引数をとり、その引数にsome_methodを呼び出します。どのくらいの頻度でブロックが呼び出されるか、どのくらいの頻度で呼び出されるかは引数SomeClassのinitializeメソッドによって決まります。 some_creation_methodは、SomeClassインスタンスを作成し、ブロックにそれを得た後、ブロックが終了した後、そのインスタンスで使用されるすべてのリソースを解放するように、多くの場合、パターン

SomeClass.some_creation_method do |x| 
    x.some_method 
end 

が、それは例えば(、可能性が使用されている

ファイルハンドルを閉じる、一時ファイルを削除するなど)。これはFile.openの機能です。問題のクラスはブロックが新たに作成されたクラスにclass_eval EDになるだろう文字通りClassある場合には


、すなわち

c = Class.new do 
    some_code 
end 

ここ

c = Class.new 
c.class_eval do 
    some_code 
end 
1

と同等ですその2つが同等でないことを示す簡単な例です。あなたのクラスのinitializeメソッドが末尾にyield(self)と呼ばれている場合に限り、それらは同等になります。 2番目の例では

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方法はブロックで何もしていないので、ブロックの内容が実行されることはありません。

関連する問題