假设我有一个ABC类,有两种方法。
class ABC
def test
"test"
end
def display_test
puts test
end
end
我只希望能够从我的控制台(IRB)拨打ABC.new.display_test
(给我'测试')并且无法就此问题致电ABC.new.test
或ABC.new.send(:test)
。这可能吗?如果是这样,怎么样?
答案 0 :(得分:5)
最彻底的方法是让test
私有和覆盖send
方法,专门阻止对test
的调用:
class ABC
def test
"test"
end
private :test
def display_test
puts test
end
def send(id)
if id == :test
raise NoMethodError.new("error")
else
super(id)
end
end
alias_method :__send__, :send
end
请注意,此send
覆盖不合适,因为它只接受一个参数。
如果以正确的方式完成,就可以做到这样的事情:
ABC.new.send(:send, :test)
答案 1 :(得分:2)
将您的方法设为私有。
一种方法是:
class Foo
private
def bar
# …
end
end
另一种方式是:
class Foo
def bar
# …
end
private :bar
end
请注意,这并不能完全阻止调用该方法:它只会停止“正常”调用。实际上,有许多方法可以在Ruby中从类外部调用私有方法。列举一些我的头脑:
Foo.new.send :bar
Foo.new.__send__ :bar
Foo.new.instance_eval { bar }
你可以尝试枚举每种可能的方式向方法发送消息,但你的努力最终可能会毫无结果:Ruby太开放了,你无法密封大门。所以坚持让它变得私密。
答案 2 :(得分:1)
这部分是可能的。您可以将其从直接调用中删除,但不能通过发送删除。这是Ruby私有方法的工作方式。
要防止直接调用它,请将其设为私有。
private :test
class TestClass
def display_test
puts test
end
private
def test
"test"
end
end
这是一个完整的例子:
puts TestClass.new.display_test
puts TestClass.new.send(:test)
begin
puts TestClass.new.test
rescue
puts "Error!"
end