如何像在 Javascript 中一样在 Ruby 中动态创建对象及其方法?

Posted

技术标签:

【中文标题】如何像在 Javascript 中一样在 Ruby 中动态创建对象及其方法?【英文标题】:How to create object and it's methods dynamically in Ruby as in Javascript? 【发布时间】:2012-07-03 17:00:30 【问题描述】:

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

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

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

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

【问题讨论】:

在编写 Ruby 时,您可能不应该尝试移植您的 JS 方法。语言有完全不同的对象模型,会有范式不匹配。 没错,谢谢提醒。我只需要一个只在我的应用程序中的单个操作中使用的小型丢弃对象,也许主要原因是我不想以程序方式执行它,它相当笨重。 :D 那你应该看看OpenStruct。 @michael 是的,我也在考虑这一点,在 Javascript 中添加属性似乎很容易。 【参考方案1】:

你可以这样做:

foo = Object.new

def foo.bar
  1+1
end

【讨论】:

【参考方案2】:

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

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)

【讨论】:

很好的答案。我以前看过,但不知怎的,我什至没有想到它,哈哈哈。谢谢。 :)【参考方案3】:

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

【讨论】:

以上是关于如何像在 Javascript 中一样在 Ruby 中动态创建对象及其方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Ruby 解析时间,就好像它在不同的时区一样?

“条件” (? :) 运算符在 JavaScript 中是不是像在 C 中一样工作?

如何使 CSS 属性动画在 Safari 中像在 Google Chrome 中一样工作?

如何像在 typescript 中一样导入 js 文件中的模块?

你能像在 .NET 中一样在 javascript 中获取文化信息字符串吗? [复制]

有没有办法像在 javascript 中一样在 C# 中交替使用单引号和双引号?