【问题标题】:How to create object and it's methods dynamically in Ruby as in Javascript?如何像在 Javascript 中一样在 Ruby 中动态创建对象及其方法?
【发布时间】: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 中添加属性似乎很容易。

标签: ruby object methods


【解决方案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 对对象使用的想法太不同了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-11
      • 2012-02-23
      • 1970-01-01
      • 2012-09-28
      • 2014-05-21
      • 1970-01-01
      • 2018-04-20
      • 2021-07-30
      相关资源
      最近更新 更多