#ruby
#ruby
Вопрос:
Как мне передать имя параметра в следующем случае .. имя оценивается перед передачей в class_eval
class Foo
end
Foo.class_eval %Q{
def hello(name)
p "hello #{name}"
end
}
Извините, что не предоставил весь сценарий…
Я просто хотел динамически добавить метод экземпляра в класс, и этот метод должен иметь возможность принимать аргументы…
приведенный выше код не будет компилироваться с жалобой на то, что имя не определено как локальная переменная при выполнении в irb..
Спасибо
Комментарии:
1. Не уверен, о чем вы спрашиваете; вы хотите изменить имя параметра на
hello
? О, я понимаю — ответы — это самое простое решение.2. ваш вопрос едва ли последователен
Ответ №1:
Другие ответы — это «правильный» ответ, но вы также можете просто пропустить интерполяцию внутри p
вызова:
Foo.class_eval %Q{
def hello(name)
p "hello #{name}"
end
}
Я думал, вы хотите изменить фактическое имя параметра (возможно, полезное для завершения или при использовании Pry для динамических методов), здесь предполагая, что оно является глобальным, но также может быть передано в метод, выполняющий class_eval
:
Foo.class_eval %Q{
def hello(#{$argname})
p "hello #{$argname}"
end
}
Комментарии:
1. @coool Остальные тоже так делают 😉 Вероятно, это тоже лучшие ответы, более чистые.
Ответ №2:
Действительно просто:
Foo.class_eval do
def hello(name)
p "hello #{name}"
end
end
Ответ №3:
Попробуйте передать блок class_eval
вместо массива (по этой ссылке):
class Foo
end
Foo.class_eval {
def hello(name)
p "hello #{name}"
end
}
Затем вы можете вызвать метод экземпляра hello
обычным способом:
boo = Foo.new
boo.hello("you")
который выдает:
>> boo.hello("you")
"hello you"
=> nil
Комментарии:
1. Я хотел передать строку / создать новый метод из строки.. в любом случае спасибо за ваш ответ
Ответ №4:
class Foo
end
Foo.class_eval do
define_method :hello do |name|
p "hello #{name}"
end
end
Foo.new.hello("coool") # => "hello coool"
Комментарии:
1. у ruby есть несколько способов сделать что-то… добавляйте динамически методы … ура
2. почему вы использовали
define_method
вместо простоdef
? 🙂3. Точно по той же причине, по которой вместо открытия класса использовался #class_eval: просто так 🙂