Подтвердить что ты не робот

Как преобразовать строку в метод класса?

Вот как преобразовать строку в класс в Rails/Ruby:

p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize

Но что, если я извлекаю метод из массива/активного объекта записи, например:

Post.description

но это может быть

Post.anything

где что-то такое строка, как anything = "description".

Это полезно, поскольку я хочу реорганизовать очень большой класс и сократить количество строк кода и повторений. Как я могу заставить его работать?

4b9b3361

Ответ 1

Post.send(anything)

Ответ 2

В то время как eval может быть полезным инструментом для такого рода вещей, а те из других фонов могут использовать его так часто, как можно было бы использовать консервный нож, на самом деле это опасно использовать так небрежно. Eval подразумевает, что все может случиться, если вы не будете осторожны.

Более безопасный метод таков:

on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)

Передача объекта # вызовет любой метод, который вы хотите. Вы можете отправить символ или строку и при условии, что метод не является закрытым или защищенным, должен работать.

Ответ 3

Так как это задано как вопрос Ruby on Rails, я немного объясню.

В Rails 3, предполагая, что title - это имя поля для объекта ActiveRecord, то также справедливо следующее:

@post = Post.new
method = "title"

@post.send(method)                # => @post.title
@post.send(method+'=',"New Name") # => @post.title = "New Name"

Ответ 4

Попробуйте следующее:

class Test
 def method_missing(id, *args)
   puts "#{id} - get your method name"
   puts "#{args} - get values"
 end
end

a = Test.new
a.name('123')

Таким образом, общий синтаксис будет a.<anything>(<any argument>).