ruby方法 - ruby类继承




将方法添加到实例化对象 (5)

使用instance_eval

obj = SomeObject.new

obj.instance_eval do
  def new_method
    puts 'do something new'
  end
end

obj.new_method 
> "do something new"
obj = SomeObject.new

def obj.new_method
  "do some things"
end

puts obj.new_method
> "do some things"

这没问题。 但是,我需要在现有方法中做同样的事情:

def some_random_method
  def obj.new_method
    "do some things"
  end
end

也可以正常工作,但在方法中使用方法看起来非常可怕。 问题是,有没有其他方法可以添加这样的方法?


使用Mixin。

module AdditionalMethods
  def new_method
    "do some things"
  end
end

obj = SomeObject.new
obj.extend(AdditionalMethods)

puts obj.new_method
> "do some things"

您可以使用模块。

module ObjSingletonMethods
  def new_method
    "do some things"
  end
end


obj.extend ObjSingletonMethods

puts obj.new_method # => do some things

现在,如果您需要向该对象添加更多方法,您只需要在模块中实现这些方法即可。


我问这个问题已经很久了。 在ruby 1.9+中,使用define_singleton_method有一种更好的方法,如下所示:

obj = SomeObject.new

obj.define_singleton_method(:new_method) do
  "do some things"
end

class Some
end 

obj = Some.new

class << obj
  def hello 
    puts 'hello'
  end 
end 

obj.hello

obj2 = Some.new
obj2.hello # error

语法class << obj意味着我们打开对象的类的定义。 您可能知道我们可以使用如下语法定义Ruby类方法:

class Math

    class << self 

        def cos(x)
            ...
        end 

        def sin(x)
            ...
        end 
    end 
end 

然后我们可以使用这样的方法:

Math.cos(1)

在Ruby中,一切都是对象 - 甚至是类。 self这里是Math class本身的对象(您可以使用Math.class访问该对象)。 所以语法class << self意味着我们正在为Math class object打开类。 是的,这意味着Math class也有类(Math.class.class)。







ruby