首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用new调用时,sorbet可以处理initialize()的私有定义吗?

当用new调用时,sorbet可以处理initialize()的私有定义吗?
EN

Stack Overflow用户
提问于 2020-12-22 21:17:37
回答 1查看 105关注 0票数 1

调用initialize方法时出现错误:

代码语言:javascript
复制
# typed: true
class A
  extend T::Sig

  sig {params(x: Integer).void}
  private def initialize(x)
  end
end

def main
  A.new(91)  
end

以下是冰沙的结果:

代码语言:javascript
复制
editor.rb:11: Non-private call to private method initialize on A https://srb.help/7031
11 |  A.new(91)  
      ^^^^^^^^^
editor.rb:6: Defined in A here
 6 |  private def initialize(x)
              ^^^^^^^^^^^^^^^^^
Errors: 1

[https://sorbet.run/#%23%20typed%3A%20true%0Aclass%20A%0A%20%20extend%20T%3A%3ASig%[…]0A%20%20end%0Aend%0A%0Adef%20main%0A%20%20A.new(91)%20%20%0Aend](https://sorbet.run/#%23%20typed%3A%20true%0Aclass%20A%0A%20%20extend%20T%3A%3ASig%%5B%E2%80%A6%5D0A%20%20end%0Aend%0A%0Adef%20main%0A%20%20A.new(91%29%20%20%0Aend)

EN

回答 1

Stack Overflow用户

发布于 2020-12-22 21:36:07

这看起来像是private中的一个错误,因为该语言对initialize进行了特殊处理,因此在默认情况下,它始终是bug。换句话说,您的代码与没有private的相同代码是100%相同的

代码语言:javascript
复制
# typed: true
class A
  extend T::Sig

  sig {params(x: Integer).void}
  def initialize(x)
  end
end

def main
  A.new(91)  
end

p A.private_instance_methods(false).include?(:initialize)
#=> true

Which passes type checking with flying colors.

我的猜测是,索贝特并不“知道”initialize在Ruby中的特殊处理,因此将其视为一种正常的方法。我的第二个猜测是,索贝特包含了一个对Class#new的定义,如下所示:

代码语言:javascript
复制
class Class
  def new(...)
    obj = allocate
    obj.initialize(...)
    obj
  end
end

这意味着,只要initialize认为它是public,一切都是白兰地,但是一旦它认为它是private,它就失败了。

然而,Class#new的实际实现看起来更像这样:

代码语言:javascript
复制
class Class
  def new(...)
    obj = allocate
    obj.__send__(:initialize, ...)
    obj
  end
end

如果我的假设是正确的,那么在冰沙中有两个bug通常会相互抵消:

  • Class#new的定义是错误的。这意味着你总是会得到一个错误,因为initialize总是private,除了
  • initialize的默认可见性也是错误的。

然而,我没有检查这些假设,所以我可能完全错了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65409434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档