2017-01-16 3 views
-3

У меня есть метод, как этотКак использовать имя метода в качестве аргумента

def foo(method_name) 
    bars.find{|bar| bar.method_name } 
end 

Аргумент method_name является символом и метод method_name возвращает логическое значение.

Могу ли я написать этот метод, используя &:? Я хочу написать, как:

bars.find("&:#{method_name}") 

Но это не работает.

+0

метод вы _have_ не будет работать уже. 'Bars.find {| бар | bar.method_name} 'может быть переписано как' bar.find (&: имя_файла) '. – mudasobwa

+0

@mudasobwa: наверняка вы имеете в виду 'bars.find (& method_name)'? –

+0

@SergioTulentsev, конечно, я этого не делал :) 'bars.find {| bar | bar.any? } 'будет' bar.find (&: any?) '-вас путают по имени' method_name' :) – mudasobwa

ответ

0

попробовать

def foo(method_name) 
    method_sym = method_name.to_sym 
    bars.find(&method_sym) 
end 

# one line 
def foo(method_name) 
    bars.find(&method_name.to_sym) 
end 

или

def foo(method_name) 
    bars.find{|bar| bar.public_send(method_name)} 
end 
+1

Как это ответить на вопрос? Кроме того, использование 'send' вместо' public_send' является запахом кода. – mudasobwa

+0

Я предположил, что 'method_name' является строкой. –

+0

'' # {method_name} "в предположении" 'имя метода' 'строка 'бессмысленно. – mudasobwa

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