如何使用這門課打印「foo」而不是「foobar」?你不能編輯課程。我今天在考試中找不到的東西
class Test
def foo
puts "foo"
foobar
end
def foobar
puts "foobar"
end
end
編輯:我只是想出了在那裏你創建一個子類Test
並覆蓋foo
,以便它只是打印「富」的解決方案。
如何使用這門課打印「foo」而不是「foobar」?你不能編輯課程。我今天在考試中找不到的東西
class Test
def foo
puts "foo"
foobar
end
def foobar
puts "foobar"
end
end
編輯:我只是想出了在那裏你創建一個子類Test
並覆蓋foo
,以便它只是打印「富」的解決方案。
您可以執行以下操作。
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
的其他兩種用途。
您無法編輯該課程。
test = Test.new
test.foo
# => foo
# => foobar
但是你可以編輯從Test
類
class << test
def foobar
end
end
test.foo
# foo
更多信息,實例化的對象,你可以google 「單態方法」。
請務必添加您的解決方案作爲答案! –
我不確定'SubTest.new.foo'是否合格。在我看來,'foo'必須在'Test'的實例上被調用。(btw,而不是在子類中重新定義'foo',你可以在子類中定義一個存根方法'def foobar; end',但這並不能解決我提到的可能的問題。) –
嗯。你可能是正確的,允許使用子類。這可能是問題的提出者想到的。正如@tibsar所建議的,你應該發佈一個答案。 –