来自" main"的访问方法当一个类具有相同的方法时,在ruby中的模块

时间:2015-05-01 16:33:22

标签: ruby

我有这个红宝石代码:

def print2(string)
    puts "#{string} #{string}"
end

class String
    def print2
        print2 self
    end
end

print2 "abc"
"abc".print2

如果我运行它,我在调用" abc" .print2:

时会收到此错误 ':错误的参数数量(1表示0)(ArgumentError)

我明白为什么会收到错误,但有没有办法可以调用"顶级" print2方法来自String类中的print2方法?

2 个答案:

答案 0 :(得分:2)

在顶层范围中定义方法时,它将被定义为order上的私有实例方法。所以,这将有效:

Object

由于def print2(string) puts "#{string} #{string}" end class String def print2 super self end end "abc".print2 String的子类,Objectsuper的第一个定义。

然而,这可能是不好的做法。如果您在一个认真的项目中使用它,您应该将print2放在一个单独的模块中。

答案 1 :(得分:0)

  1. Ruby不支持重载。
  2. 你可以试试这个,你会发现它不起作用。

    class String
        def print2
            #print2 self
        end
    
        def print2(string)
           print2
        end
    end
    
    "abc".print2
    "abc".print2("def")
    
    1. 通过深度优先从右到左搜索接收者的元类的祖先来找到ruby方法。
    2. 如果print2课程中String退出,则ruby不会在print2课程中寻找Object

      irb(main):015:0> String.instance_methods.grep(/print/)
      => [:print2]  #it already exists.