我最近发现在 Ruby 中动态创建对象和方法是一项艰巨的工作,这可能是因为我在 Javascript 方面的背景经验。
在 Javascript 中,您可以动态创建对象,其方法如下:
function somewhere_inside_my_code() {
foo = {};
foo.bar = function() { /** do something **/ };
};
在 Ruby 中完成上述语句的等效性如何(就像在 Javascript 中一样简单)?
您可以使用单例方法来实现这一点。请注意,您可以对所有对象执行此操作,例如:
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)
你可以这样做:
foo = Object.new
def foo.bar
1+1
end
您可以尝试OpenStruct
:http ://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html ,它在某些方面类似于 JavaScript,但只有属性,而不是方法。Ruby 和 JavaScript 对对象使用了太多不同的想法。