我有方法X和Y的A类。现在我想创建一个实例但只希望它有来自A类的方法X.
我该怎么办?是否应该在创建实例时删除方法Y?感谢您的帮助!
答案 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)