gpt4 book ai didi

ruby - 如何使用 Ruby Duck 打字

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:08 29 4
gpt4 key购买 nike

我正在学习 Ruby,我遇到了一个关于打字的主要概念问题。请允许我详细说明为什么我不理解范式。

假设我像您在 Ruby 中一样为简洁的代码进行方法链接。我必须准确地知道链中每个方法调用的返回类型是什么,否则我无法知道下一个链接上有哪些方法可用。难道我每次都要检查方法文档吗??我遇到了这个不断运行的教程练习。似乎我陷入了引用、推断、运行、失败、修复、重复以使代码运行的过程,而不是准确地知道我在编码过程中使用的是什么。这与 Ruby 的直观性 promise 背道而驰。

假设我正在使用第三方库,我再次需要知道允许哪些类型传递参数,否则我会失败。我可以查看代码,但可能有也可能没有任何关于该方法期望的类型的注释或声明。我了解您基于方法的代码可用于对象,而不是类型。但是我必须确保我作为参数传递的任何内容都具有库所期望的所有方法,所以我仍然必须进行类型检查。我是否必须希望并祈祷在界面上正确记录所有内容,以便我知道是否需要提供字符串、散列、类等。

如果我查看方法的源代码,我可以获得被调用方法的列表并推断出预期的类型,但我必须执行分析。

Ruby and duck typing: design by contract impossible?

前面的 stackoverflow 问题中的讨论除了“你必须遵循一些流程”之外并没有真正回答任何问题,而且这些流程似乎并不标准,每个人对遵循什么流程都有不同的看法,并且该语言的执行为零。方法验证?测试驱动设计?记录的API?严格的方法命名约定?标准是什么,谁规定的?我要遵循什么?这些指南能否解决这个问题 https://stackoverflow.com/questions/616037/ruby-coding-style-guidelines ?是否有编辑器可以提供帮助?

从概念上讲,我也没有优势。您需要知道所调用的任何方法都需要哪些方法,因此无论您在编写任何代码时都在键入什么。除非您决定记录它,否则您只是没有明确通知语言或其他任何人。然后你就被困在运行时而不是编码期间进行所有类型检查。我已经完成了 PHP 和 Python 编程,但我也不了解它们。

我缺少或不理解什么?请帮助我理解这个范例。

最佳答案

这不是 Ruby 特有的问题,所有动态类型语言都一样。

通常也没有关于如何记录这一点的指导方针(而且大多数时候是不可能的)。参见例如 map在 ruby 文档中

map { |item| block } → new_ary
map → Enumerator

什么是 item , blocknew_ary这里和它们有什么关系?除非您知道实现或可以以某种方式从函数名称推断出它,否则无法判断。指定类型也很难,因为 new_ary取决于什么block返回,这又取决于 item 的类型,数组中的每个元素都可能不同。

很多时候,您也会偶然发现说明参数类型为 Object 的文档。 , 这又一次告诉你什么都没有,因为一切都是对象。

OCaml 对此有一个解决方案,它支持结构类型,因此需要一个具有属性 foo 的对象的函数那是一个 String将被推断为 { foo : String }而不是具体类型。但是 OCaml 仍然是静态类型的。

值得注意的是,这在静态类型语言中也是一个问题。 Scala 对集合有非常通用的方法,这会导致像 ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Array[T], B, That]): That 这样的类型签名。用于附加两个集合。

所以大多数时候,您只需要用动态类型语言记住这一点,也许有助于改进您正在使用的库的文档。

这就是为什么我更喜欢静态类型 ;)

编辑 一件可能有意义的事情是做 Scala 也做的事情。它实际上并没有向您显示 ++ 的类型签名默认情况下,它显示 ++[B](that: GenTraversableOnce[B]): Array[B]这不是通用的,但可能涵盖了大多数用例。所以对于 Ruby 的映射,它可以有一个像 Array<a> -> (a -> b) -> Array<b> 这样的单态类型签名。 .它仅适用于列表仅包含一种类型的值且 block 仅返回另一种类型的元素的情况,但它更容易理解并且很好地概述了函数的作用。

关于ruby - 如何使用 Ruby Duck 打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19165430/

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