Как создать объект и его методы динамически в Ruby, как в Javascript?
Недавно я обнаружил, что динамическое создание объекта и методов в Ruby - это довольно сложная работа, возможно, из-за моего опыта работы в Javascript.
В Javascript вы можете динамически создавать объект и его методы следующим образом:
function somewhere_inside_my_code() {
foo = {};
foo.bar = function() { /** do something **/ };
};
Как эквивалент выполнения вышеуказанных утверждений в Ruby (так же просто, как в Javascript)?
Ответы
Ответ 1
Вы можете добиться этого с помощью одноэлементных методов. Обратите внимание, что вы можете сделать это со всеми объектами, например:
str = "I like cookies!"
def str.piratize
self + " Arrrr!"
end
puts str.piratize
который выведет:
I like cookies! Arrrr!
Эти методы действительно определены только для этого единственного объекта (отсюда и название), поэтому этот код (выполненный после указанного выше кода):
str2 = "Cookies are great!"
puts str2.piratize
просто генерирует исключение:
undefined method `piratize' for "Cookies are great!":String (NoMethodError)
Ответ 2
Вы можете сделать что-то вроде этого:
foo = Object.new
def foo.bar
1+1
end
Ответ 3
Вы можете попробовать OpenStruct
: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html, он похож на JavaScript в некотором роде, но только со свойствами, а не с методами. Ruby и JavaScript используют слишком разные идеи для объектов.