[英]Cannot override to_s in irb
我在pry中定義了一個函數:to_s,但是我無法調用它。 這種方法在哪里,我怎么稱呼它?
pry(main)> def to_s
pry(main)* 'hello'
pry(main)* end
pry(main)> to_s
=> "main"
我的ruby版本是2.1.2
當在irb或pry中定義方法時,它轉到Object.instance_methods
[1] pry(main)> def to_s
[1] pry(main)* 'hello'
[1] pry(main)* end
=> :to_s
[2] pry(main)> def hello
[2] pry(main)* 'world'
[2] pry(main)* end
=> :hello
[4] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :to_s, :hello]
可以在新對象中調用這些新方法。
[6] pry(main)> Object.new.to_s
=> "hello"
我無法在頂層調用to_s的原因是main
是一個定義了#to_s
和#inspect
方法的特殊對象。
[5] pry(main)> singleton_class.instance_methods(false)
=> [:to_s, :inspect]
@ Anthony的答案解釋了背景。 要在此級別定義您自己的to_s
,您可以這樣做:
pry(main)> to_s
=> "main"
pry(main)> def self.to_s
pry(main)* 'hello'
pry(main)* end
pry(main)> to_s
=> "hello"
您實際上處於頂級Object class#to_s
方法,正如文檔所述:
返回表示obj的字符串。 默認的to_s打印對象的類和對象id的編碼。 作為一種特殊情況,作為Ruby程序的初始執行上下文的頂級對象返回“main”。
在toplevel定義的方法成為Object
private
實例方法。
所以,
def to_s; 'hello' end
相當於
class Object; private def to_s; 'hello' end end
沒有顯式接收器的消息發送被隱式發送給self
。
所以,
to_s
相當於
self.to_s
在頂層, self
是無名的頂級對象,通常稱為main
。
現在,如果任何main
類覆蓋Object#to_s
,則將調用被覆蓋的版本。 而事實上, to_s
被重寫的單例類的main
:
method(:to_s).owner
# => #<Class:#<Object:0x007fb5210c1c68>>
完成你要做的事情的另一種方法是,操作“當前”類,如下所示:
class << self
def to_s
"hello"
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.