12

我最近发现在 Ruby 中动态创建对象和方法是一项艰巨的工作,这可能是因为我在 Javascript 方面的背景经验。

在 Javascript 中,您可以动态创建对象,其方法如下:

function somewhere_inside_my_code() {
  foo = {};
  foo.bar = function() { /** do something **/ };
};

在 Ruby 中完成上述语句的等效性如何(就像在 Javascript 中一样简单)?

4

3 回答 3

12

您可以使用单例方法来实现这一点。请注意,您可以对所有对象执行此操作,例如:

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)
于 2012-07-03T09:33:34.393 回答
5

你可以这样做:

foo = Object.new

def foo.bar
  1+1
end
于 2012-07-03T09:25:36.467 回答
3

您可以尝试OpenStructhttp ://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html ,它在某些方面类似于 JavaScript,但只有属性,而不是方法。Ruby 和 JavaScript 对对象使用了太多不同的想法。

于 2012-07-03T11:20:45.060 回答