2016-12-09 8 views
0

メソッドを実行せずにメソッドのリストを作成するにはどうしたらいいですか?例えばメソッドのリスト:メソッドは常に呼び出されます

def somedef 
    (anything) 
end 
a = [system("echo 'hello'"), 1, somedef] 

あなたがa=[system("echo 'hello'"), 1, somedef]を入力した後、あなたがhellosomedefメソッドの結果を取得します。しかし、私は例えばリスト内のメソッドとリストを連結したいと思っています。あなたは方法はPROCの呼び出し方法を実行実行する必要があるときはいつでも

+1

タグであるためタイトルに「Ruby」は必要ありません。 –

答えて

1

はprocの

a = [Proc.new {system("echo 'hello'")}, Proc.new {1}, Proc.new{somedef}] 

を使用してください。

a[0].call #Output: hello 
a[1].call #Output: 1 
+0

どちらが最善の方法か、Proc? – somenxavier

1

Rubyでは、メソッドを呼び出すときにかっこを省略することができます。 (私はあなたが今までこれを見たことがないことに非常に驚いています。そうするのはかなり一般的です)。Ergo、あなたがやっていることは単にメソッドを呼び出すことです。

あなたがオブジェクトとしてメソッドへの参照を取得したい場合は、あなたがMethodオブジェクトを返すmethod方法、呼び出すことができます。method()を使用して

a = [system("echo 'hello'"), 1, method(:somedef)] 
+0

私はPythonから来た – somenxavier

1

を:依存

def hello 
    system("echo 'hello'") 
end 
=> nil 

a = [method(:hello), 1] 
=> [#<Method: Object#hello>, 1] 

foo[0].call 
hello 
=> true 
1

あなたの必要性は、シンボルを保存して、必要なときにシンボルを適切なオブジェクトに送信することもできます。例:

def some_def 
    ... 
end 
a = [:some_def] 
self.send(a[0]) 

これは、このページの他の良い回答の代替です。それは弱い契約です(このメッセージを送信するオブジェクトがそれらに応答することを知る必要があります)が、いくつかのシナリオでは十分かもしれません。

関連する問題