gpt4 book ai didi

ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:02 24 4
gpt4 key购买 nike

class A

private
def foo
puts :foo
end

public
def bar
puts :bar
end

private
def zim
puts :zim
end

protected
def dib
puts :dib
end
end

A的实例

a = A.new

测试

a.foo rescue puts :fail
a.bar rescue puts :fail
a.zim rescue puts :fail
a.dib rescue puts :fail
a.gaz rescue puts :fail

测试输出

fail
bar
fail
fail
fail

.发送测试

[:foo, :bar, :zim, :dib, :gaz].each { |m| a.send(m) rescue puts :fail }

.发送输出

foo
bar
zim
dib
fail

问题

标有“测试输出”的部分是预期结果。那么,为什么我可以通过简单的 Object#send 访问私有(private)/ protected 方法?

也许更重要:

在 Ruby 中,public/private/protected 有什么区别?什么时候使用?有人可以提供 privateprotected 用法的真实示例吗?

最佳答案

技术上:因为 send 不做任何检查方法可见性的事情。 (这样做会更费力。)

哲学上:Ruby 是一种非常宽松的语言。您已经可以只打开一个类并公开您想要的任何方法。语言设计者实现 send 的方式允许它覆盖通常由 private 强加的限制。 Ruby 1.9 最初打算有两个变体,一个是 private-respecting send 一个是不安全的变体,叫做 send!,但这显然被放弃了向后兼容性。

至于privateprotectedpublic是什么意思:

  • public 方法可以被任何发送者调用
  • protected 方法不能在方法类的实例或子类的实例之外调用
  • private 方法不能用显式接收者调用(有几个异常(exception),例如 setter 方法,它总是必须有一个显式接收者,因此可以在类中以这种方式调用)

关于ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com