如何在Ruby中创建一个类的部分方法实例?

时间:2014-04-09 22:32:03

标签: ruby

我有方法X和Y的A类。现在我想创建一个实例但只希望它有来自A类的方法X.

我该怎么办?是否应该在创建实例时删除方法Y?感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你不应该这样做。您应该分享您正在解决的问题并找到解决问题的更好模式。


解决这个问题的一个例子有点不同:

class A
  def x; end
end

module Foo
  def y; end
end

instance_with_y = A.new
instance_with_y.send :include, Foo
instance_with_y.respond_to? :y #=> true

答案 1 :(得分:1)

有可能用红宝石做你想要的东西,因为红宝石可以像这样具有很强的可塑性,但有更好的方法。你想要实现的目标似乎是一个非常糟糕的主意。

您刚才描述的问题继承问题旨在解决。所以,你有两个班级。班级A以及班级B,其继承自班级A

class A
  def foo
    'foo'
  end
end

# B inherits all functionality from A, plus adds it's own
class B < A
  def bar
    'bar'
  end
end

# an instance of A only has the method "foo"
a = A.new
a.foo #=> 'foo'
a.bar #=> NoMethodError undefined method `bar' for #<A:0x007fdf549dee88>

# an instance of B has the methods "foo" and "bar"
b = B.new
b.foo #=> 'foo'
b.bar #=> 'bar'

答案 2 :(得分:1)

以下是解决问题的一种方法:

class X
  def a 
    11
  end
  def b
    12
  end
end

ob1 = X.new
ob1.b # => 12
ob1.singleton_class.class_eval { undef b }
ob1.b
# undefined method `b' for #<X:0x9966e60> (NoMethodError)

或者,你可以写为(上下都相同):

class << ob1
  undef b
end

ob1.b
# undefined method `b' for #<X:0x93a3b54> (NoMethodError)