2016-12-09 5 views
0

Как я могу составить список методов без его запуска и использования последнего?Список методов: методы вызываются всегда

Например

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

После ввода a=[system("echo 'hello'"), 1, somedef] вы получите hello и результат somedef метода. Но я хочу, например, объединить списки с методами внутри.

+1

Вам не нужен «Ruby» в названии, так как это тег. –

ответ

1

Используйте процедурный

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 вы можете оставить круглые скобки при вызове метода. (Я очень удивлен, что вы никогда не видели этого раньше, поскольку это действительно довольно часто для этого). Эрго, то, что вы делаете, просто вызывает методы.

Если вы хотите, чтобы получить ссылку на метод в качестве объекта, вы можете вызвать method метод, который возвращает Method объект:

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

Я пришел из python – somenxavier

1

Использование method():

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]) 

Это просто альтернатива другим хорошим ответам на этой странице. Это слабый контракт (вы должны знать, что объект, которому вы отправляете это сообщение, будет отвечать на них), но этого может быть достаточно для некоторых сценариев.

Смежные вопросы