Как создать объект и его методы динамически в 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 используют слишком разные идеи для объектов.