问题标签 [sorbet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - Sorbet:我如何编写通用工厂方法?
我有一个工厂方法,它接收一个类并返回一个实例。在Java中,我可以这样表达:
爪哇
当试图在冰糕中创建类似的签名时,它最终会出错。静态检查器的错误信息:T.class_of needs a Class as its argument
对于Factory#createInstance
s 的签名。
红宝石/冰糕:
在线查看:sorbet.run
我当然明白接受课程的意义。但是,T.type_parameter(:V)
实际上是在表达一个变量类。所以它也应该被接受。与 Java 中接受的方式相同。
但是,也许我只是表达错误。在冰糕中编写通用工厂签名的正确方法是什么?
ruby - 打印代码符号表失败并出现 RuntimeError
我将冰糕从 v0.5.5569 更新到 v0.5.5753。在更新之前,我在运行时出现了 0 个错误bundle exec srb tc
,但是在更新之后我得到了Errors: 66
。我决定跑步bundle exec srb rbi update
会有所帮助。但它失败了RuntimeError
,这是回溯:
我可以以某种方式修复它,还是我唯一的选择是暂时停留在 v0.5.5569 上?
ruby - 初始化冰糕时如何忽略某些目录?
摘要:据我所知,当我运行时srb init
,它需要每个文件。有没有办法在生成配置之前禁用或自定义此行为sorbet/
?
我遇到了一些麻烦,因为我的团队将 gems 保存在一个非标准位置(它是一个多语种 monorepo。)特别是,我想告诉 Sorbet 忽略 , 和 — 中的内容_build
,db
而不是在每个文件script
中添加 a typed: ignore
(显然这对我们不起作用,因为宝石是如何设置的)我怎样才能让冰糕忽略这些?
(一些背景知识:我们在 Sorbet 刚推出时尝试采用静态检查,但由于我们使用 Rails 并且工具还不够好,因此无法采用。但是,我们发现运行时检查非常有用,所以我们一直在使用那些广泛的。我每隔几个月就重新评估一次静态方面,并且在尝试创建目录时一直被卡住sorbet
!)
sorbet - 嵌套哈希的冰糕签名
我有一个解析 YAML 文件的方法。返回的对象是一个嵌套哈希,其中键始终是字符串,叶值始终是字符串,例如
我事先不知道哈希有多深。
我最接近输入返回值的是以下签名:
这显然是一个糟糕的解决方案,因为它不会检查第二次嵌套下的任何内容,但有关自定义类型的文档似乎有点稀疏。
有没有办法使用自定义类型、嵌套类型或类似的东西来键入嵌套哈希?
ruby-on-rails - Sorbet-rails 不为 rails has_many、belongs_to 等生成 RBI
也许我错过了初始化过程中的某些内容,但sorbet-rails
似乎无法为某些默认的 rails 方法(例如,、、has_many
等belongs_to
)validates
生成方法。我可以看到生成了相应的生成关联,但是我收到类型抱怨主要方法不存在。
例如这样的类:
我可以在 role.rbi 中看到自动生成的印记
但是,这是我在检查类型时遇到的错误:
ruby - 在冰糕中,你能指定一个类型是一个类的后代吗?
我有一个方法返回一个对象,该对象可能是许多不同类型的对象之一,但它们都是同一个祖先类的一部分。精确的对象类型是动态推断的。
但是,我对在签名中为返回值添加什么感到困惑。我在下面放置了一个占位符instance_of
来说明问题:
鉴于我不知道将返回哪个精确的类(而且我不想明确列出它们),但我知道它将ParentClass
是 Sorbet 中是否有办法指定它的子类?我可以使用T.untyped
,但它不必要地松动。
ruby - 为什么这个 Sorbet 错误算作动态常量引用?
我在 Sorbet 中收到以下错误:
Guardian 类具有以下结构
它旨在使其可以在子对象上进行更改。它还被设计成如果它没有在子对象上指定,我们会听到它。我很想知道为什么这样的设计模式是(隐含的)不好的做法。我是否应该跳过常量而只在辅助方法中定义它:get_min_auth
?
ruby-on-rails - 在 Ruby 中,有没有一种可接受的方式将类拆分为更小的、可组合的 mixin(知道父级)?
我发现 Ruby 中的某些类,尤其是User
Ruby on Rails 中的类,有变得非常庞大的趋势。这本身几乎是可管理的,但如此大类的测试文件也变得庞大。
为了尝试区分这种复杂性,我想从几个子类组成用户类。
从技术上讲,这是可行的,但这意味着 Mixins 最终会引用 User 对象上的一堆属性,而这些属性实际上并不知道。以这个 EmailsMixin 为例,它划分了每个用户多封电子邮件的所有逻辑:
这行得通,但它闻起来并不好...
虽然这一切都有效,但感觉就像是难闻的代码。为什么要User::EmailsMixin
引用它不知道的primary_email?这将是 mixins 的本质——它们都引用父对象(在这种情况下是用户)上的属性。
不仅如此,现在我正在使用 Sorbet Typechecking 它没有通过类型检查。Sorbet 准确地指出了这个错误并指出Method primary_email does not exist on User::EmailsMixin
。这当然是真的。
所以我有三个问题:
- 这是划分代码的合理范例吗?请注意,这不是可以移动到服务对象中的代码,它直接与用户对象上的属性相关(如上所述)
- 如果这是一个合理的范例,是否有办法在每个 mixin 中引用父对象?有没有办法说“这个模块实际上是用户对象的一部分,稍后将被包含/合并”
- 如果这不是将大量类分解为更小的类的合理方法,那么我应该如何考虑这样做(重新迭代,服务对象不会在这里剪切它,因为代码需要访问父属性)
ruby - “方法 << 在 T.class_of(A) 上不存在”将 def_delegators 与 sorbet 一起使用
我有一个代码,它使用 Singleton 和 Forwardable 将一些方法委托给 internal Hash
。
我在课外使用A << B.new
,A
当我跑步时,be srb tc
我得到Method << does not exist on T.class_of(A)
. 有什么建议或想法可以让我摆脱这个警告吗?
ruby-on-rails - 运行 srb rbi hidden-definitions 给出不明确的错误
语境
- 我们的团队最近升级到 rails 6(从 5.2)。AFAIK,到目前为止,事情进展顺利。
- 我们有一个非常规的文件结构,所以我们选择使用
:classic
rails loader 而不是:zeitwerk
问题
每当我们srb rbi hidden-definitions
现在运行时,我们都会得到以下信息:
reflect.json.err(错误指向)充满了无数错误,看起来像这样:
问题
关于如何前进的任何建议?一个预感是我们需要迁移到:zeitwerk
以解决这个问题,但这对我们来说是一个相当大的重构,所以我在没有确认这是导致此失败的潜在原因的情况下犹豫是否要探索这个问题。