ArteNonMarte
@ArteNonMarte
Профессиональный мечтатель

Как в Ruby вызвать метод по имени?

В php например это можно делать так:
$m = 'gohome';
$m()
  • Вопрос задан
  • 1667 просмотров
Решения вопроса 1
ArteNonMarte
@ArteNonMarte Автор вопроса
Профессиональный мечтатель
Расширенная иллюстрация к вопросу (на примере того, как это можно реализовать на php) и решение на Ruby:

class help{

	function router($sex, $stuff){

		$method_name = 'if_'.$sex;		
		$method_name($stuff);

		// можно предварительно проверить наличие метода
		// method_exists(где_искать, имя_метода)
		// или отдать на обработку ошибок в __call()
	}

	function if_m($stuff){ 	return 'Мальчики направо'; }
	function if_w($stuff){ 	return 'Девочки налево'; }

	// аналог method_missing в Ruby
	function __call($name, $param = false){
		return 'Идите прямо, пока не определитесь';
	}
}

$sex 	= 'm'
$stuff 	= 'какая-то важная фигня';
$h 	= new help();

$h.router($sex, $stuff);


Итого, вопрос: как вызвать метод, если его имя пришло в переменной, или имя метода нужно сконструировать?

upd

Решение найдено (как минимум одно), с использованием send:

def router(act, data)
	m = 'prefix_' + act
	send(m, data)	
end
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mukizu
@mukizu
Через eval/call/send - советую о том как работают и прочих различиях перед использованием почитать дополнительно.

например

def a
  puts 1
end

send(:a)
Ответ написан
@maxprof
Студент
def hello
    puts "Hello"
end

hello
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы