覆盖Ruby String类方法

时间:2012-12-31 06:59:52

标签: ruby inheritance

我是Ruby的新手,我正试图解决这个问题:

class SuperString < String
    def size
        "The Size: " + super.size.to_s
    end
end

a = SuperString.new("My String")
b = String.new("My String")
puts a.size
puts b.size

输出结果为:

"The Size: 8"
9

为什么一个8和另一个9?

3 个答案:

答案 0 :(得分:3)

使用SuperString.new("My String").size

  • super调用超类的方法String#size,并返回9,这是字符串"My String"的长度。
  • 接下来,9.size将返回8,这是用于表示Fixnum的字节数。
  • 最后,8.to_s将返回"8"

使用String.new("My String").size

  • size将返回9,这是字符串"My String"的长度。

答案 1 :(得分:1)

这是因为你在方法.super上调用方法.size,.super调用你的类SuperString的超类(在本例中是String),以获取与你当前方法同名的方法定义

通过在super上调用.size,你实际上在super的返回值上调用.size(这是“我的字符串”的大小,即9)。

以下是你想要的方法

class SuperString < String

  def size
    "The Size: " + super.to_s
  end

end

a = SuperString.new("My String")
b = String.new("My String")

a.size # => "The Size: 9"
b.size # => 9

class SuperString < String def size "The Size: " + super.to_s end end a = SuperString.new("My String") b = String.new("My String") a.size # => "The Size: 9" b.size # => 9

答案 2 :(得分:0)

an_string = "My String"

class SuperString < String
    def size
        x = super
        p x
        y = x.size
        p y
        z = y.to_s
        p z
        "The Size: " + z
    end
end

a = SuperString.new an_string
b = String.new an_string

puts a.size
p a
puts b.size
p b

输出

9
8
"8"
The Size: 8
"My String"
9
"My String"

然后我尝试了:

Ezekiels-MacBook-Pro:/Users/tehgeekmeister| irb
1.9.3p327 :001 > 9.size
 => 8 
1.9.3p327 :002 > 8.size
 => 8 
1.9.3p327 :003 > 7.size
 => 8 
1.9.3p327 :004 > 256.size
 => 8 
1.9.3p327 :005 > 1000000000000000000000000000.size
 => 12 

基本上,8是表示大小的整数的大小。它使用8个字节。 = P