Ruby - 重新定义实例方法不起作用

时间:2011-03-22 13:30:08

标签: ruby

我重新定义实例方法的简单尝试无法正常工作

class File
  alias_method :old_atime, :atime
  def atime(*args)
    puts "helllllo"
    old_atime(*args)
  end
end


f = File.new("C:\\abc.txt","w")
puts f.atime

知道为什么吗?

我每次调用File#atime时都试图打印“helllllo”。即使alias old_atime atime无效。

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

以上代码完美应用。放“helllllo”将“helllllo”写入您打开的文件中。放在用于写作的文件实例中。

只需致电 f.close ,然后在文本编辑器中打开您的文件即可。你可以看到内容。

答案 1 :(得分:0)

是的,拉梅什是对的。试试这个:

class File
  alias_method :old_atime, :atime
  def atime(*args)
    Kernel.puts "helllllo"   # <---- Kernel method
    old_atime(*args)
  end
end


f = File.new("C:\\abc.txt","w")
puts f.atime

问题是'puts'在File中定义用于写入文件。除非在更具体的范围内定义,否则您希望使用内核。

答案 2 :(得分:0)

这应该可以正常工作,但是IO#puts写入IO对象本身,不是 STDOUT。换句话说,它正在写入文件。

f.atime内呼叫f.close几次然后irb,您应该看到每次拨打helllllo时都会将atime打印到该文件。< / p>

要打印到STDOUT,您可以使用$stdout.putsKernel.puts