如何使用此类打印“foo”而不是“foobar”?你无法编辑课程。
convert test.exr -crop 200x100+238+200 +repage -define exr:color-type=Y result.exr
编辑:我刚刚提出了一个解决方案,您可以在其中创建class Test
def foo
puts "foo"
foobar
end
def foobar
puts "foobar"
end
end
的子类并覆盖Test
,以便它只打印“foo”。
答案 0 :(得分:3)
您可以执行以下操作。
class Test
def foo
puts "foo"
foobar
end
def foobar
puts "foobar"
end
end
Test.instance_methods(false)
#=> [:foo, :foobar]
Test.new.foo
# foo
# foobar
创建别名:foobar
Test.class_eval { alias_method :old_foobar, :foobar }
#=> Test
Test.instance_methods(false)
#=> [:foo, :foobar, :old_foobar]
Test.new.old_foobar
# foobar
Test.new.foobar
# foobar
创建存根方法:foobar
。
Test.class_eval { define_method(:foobar) {} }
#=> :foobar
试试吧。
Test.new.foo
# foo
<强>清理强>
恢复原始:foobar
。
Test.class_eval { alias_method :foobar, :old_foobar }
#=> Test
Test.new.foo
# foo
# foobar
删除:old_foobar
。
Test.instance_methods(false)
#=> [:foo, :foobar, :old_foobar]
Test.class_eval { remove_method(:old_foobar) }
#=> Test
Test.instance_methods(false)
#=> [:foo, :foobar]
注意强>
Test.class_eval { alias_method :old_foobar, :foobar }
生成与
相同的别名:old_foobar
class Test
alias_method :old_foobar, :foobar
end
但它是动态的。
或者,可以写
Test.send(:alias_method, :old_foobar, :foobar)
但不是
Test.alias_method :old_foobar, :foobar
因为:alias_method
是私有的。
这些评论也适用于class_eval
的其他两种用途。
答案 1 :(得分:1)
您无法编辑课程。
test = Test.new
test.foo
# => foo
# => foobar
但您可以编辑从Test
类
class << test
def foobar
end
end
test.foo
# foo
有关详细信息,您可以使用google&#34;单例方法&#34;。