簡體   English   中英

無法覆蓋irb中的to_s

[英]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

在閱讀了一些答案並進行搜索之后,我想我得到了正確的答案:

  1. 這種方法在哪里?

當在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]
  1. 我怎么稱呼它?

可以在新對象中調用這些新方法。

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM