2

如果我定期运行这个简单的 Ruby 代码,它可以正常工作:

class String
  def add_two
    self + "2"
  end
end
puts "hello".add_two

它应该打印“hello2”。但这失败了:

:ruby
  class String
    def add_two
      self + "2"
    end
  end
  puts "hello".add_two

此代码产生错误:

NoMethodError at /
undefined method `add_two' for "hello":String

有什么想法有什么问题吗?

(不确定这是否重要,但我将 HAML 与 Sinatra 一起使用,它在 Apache 上运行,带有 Passenger 模块。)

4

2 回答 2

2

我建议 String 在另一个命名空间中,因此在另一个类中。

那会发生什么?

class ::String
于 2013-03-09T13:23:13.460 回答
1

我将您的代码按原样放入 Rails 应用程序中的一个 Haml 视图中,但我收到了一个不同的错误:

SyntaxError at /
class definition in method body

所以我想知道是不是Haml 的:ruby过滤器在抱怨,但由于它“使用普通的 Ruby 解释器解析过滤后的文本”,这似乎不太可能。因此,我搜索了有关该错误的更多信息,并找到了导致我这样做的参考资料(见下文),它有效(但实际上,永远不应该使用):

:ruby
  String.module_eval do
    def add_two
      self + "2"
    end
  end
  puts "hello".add_two

参考:

于 2013-03-09T13:22:54.177 回答