Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby – 覆盖哈希并将[]运算符设为私有 – 不能再使用|| =大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
测试代码:
class PrivHash < Hash
  def set(key,val)
     self[key] = val
  end
  def set_maybe(key,val)
    self[key] ||= val
  end
  private
  def []= key,value 
  end
  def [] key
    super            
  end
end

使用此代码,我希望set和set_maybe都能正常工作.但是,只有set works和set_maybe失败:

[30] pry(#<TranslationInfo>):1> ph.set_maybe(:a,1)
NoMethodError: private method `[]' called for {:a=>2}:#Class:0x007f99c5924c38>::PrivHash 
from (pry):56:in `set_maybe'

我假设自己[:b] || =< x>只是自我的语法糖[:b] || self [:b] =< x&gt ;,但我想这不是因为这有效. 什么错误我是为什么我得到这个错误..我从类中执行此,所以为什么我得到私有方法错误?

解决方法

目前,处理私有方法有点乱.

最初的规则是:

这是一个很好,简单,易于理解的规则.它也是一个静态规则,即它可以在不运行代码的情况下进行检查,实际上它甚至是一个语法规则,它甚至不需要复杂的静态分析,它可以在解析器中进行检查.

然而,很快就注意到这个规则使得无法调用私有setter,因为没有显式接收器就不能调用setter(foo = bar是设置局部变量,而不是调用setter).因此,规则扩大了:

这允许您使用文字值self的显式接收器调用私有setter:

self.foo = bar

但不是自我的动态价值

baz = self
baz.foo = bar # NoMethodError: private method `foo=' called

这仍然保留了在分析时可以检测到私有方法调用的属性.

年前,I filed a bug关于缩写方法分配不起作用,即:

self.foo += bar # NoMethodError

通过再次扩展私有方法调用的规则来修复该错误(现在规则已经变得如此复杂,以至于我不会拼出它).

但是,仍有很多案例未被现有规则所涵盖,其中方法在没有显式接收器的情况下根本无法在语法上调用,因此不能是私有的:

self[foo]
!self
self + foo

等等

其中一些已经修复,一些没有.问题是规则现在变得如此复杂以至于很难正确实现. There have been proposals to change the rule到这样的事情:

这是一个很好的,简单的,易于理解的规则,可以在解析时进行静态检查,并且没有我们当前的复杂异常和极端情况.但是,尚未实施AFAIK.

大佬总结

以上是大佬教程为你收集整理的ruby – 覆盖哈希并将[]运算符设为私有 – 不能再使用|| =全部内容,希望文章能够帮你解决ruby – 覆盖哈希并将[]运算符设为私有 – 不能再使用|| =所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。