class_eval как передать параметр методу

#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: просто так 🙂