Tag: 鸭子打字

如何使用Ruby Duck打字

我正在学习Ruby,而且我有一个关于打字的重大概念问题。 请允许我详细说明为什么我不理解范式。 假设我在Ruby中使用简洁代码链接方法。 我必须准确地知道链中每个方法调用的返回类型,否则我不知道下一个链接上有哪些方法可用。 我每次都必须检查方法文档吗? 我正在遇到这个不断运行的教程练习。 我似乎陷入了一个引用过程,推断,运行,失败,修复,重复以使代码运行,而不是确切地知道我在编码期间正在使用什么。 面对Ruby对直觉性的承诺,这种情况变得苍白无力。 假设我正在使用第三方库,我需要知道哪些类型允许传递参数,否则我会失败。 我可以查看代码,但可能有也可能没有任何注释或声明该方法所期望的类型。 我理解您基于方法的代码可用于对象,而不是类型。 但是我必须确定我传递的任何参数都包含库所期望的所有方法,所以我仍然需要进行类型检查。 我是否必须希望并祈祷所有内容都在接口上正确记录,所以我知道我是否应该给出一个字符串,一个哈希,一个类等等。 如果我查看方法的来源,我可以获得一个被调用的方法列表并推断出预期的类型,但我必须执行分析。 Ruby和duck打字:合同设计不可能? 前面的stackoverflow问题中的讨论并没有真正回答除了“你必须遵循的流程”之外的任何事情,而且这些流程似乎不是标准的,每个人对要遵循的流程有不同的看法,并且语言有零执法。 方法validation? 测试驱动设计? 记录的API? 严格的方法命名约定? 什么是标准,谁来决定它? 我该怎么做? 这些指南是否会解决这个问题? https://stackoverflow.com/questions/616037/ruby-coding-style-guidelines ? 编辑有帮助吗? 从概念上讲,我也没有获得优势。 您需要知道所调用的任何方法需要哪些方法,因此无论您在编写任何代码时都在键入。 您只是没有明确告知语言或其他任何人,除非您决定将其记录下来。 然后你就会在运行时而不是在编码期间进行所有类型检查。 我已经完成了PHP和Python编程,我也不了解它。 我错过了什么或不理解? 请帮助我理解这个范例。

当你说Ruby是反思的时候,这主要是指“鸭子打字”吗?

我正在阅读描述Ruby的文本,它说: Ruby被认为是一种“反思”语言,因为Ruby程序可以分析自身(就其构成而言),调整其工作方式,甚至用其他代码覆盖自己的代码。 我对这个术语“反思”感到困惑 – 这主要是谈论Ruby可以查看变量并弄清楚它是Integer还是String(duck typing)的方式,例如: x = 3 x = “three” # Ruby reassigns x to a String type

在Ruby中实现to_int和to_str的后果

我有一个类 ,它暴露一个字符串值和一个int值(分别是一个命令输出和退出代码)。 除了通过to_s和to_i公开它们to_i ,我还使用to_str和to_int ,如下所示: class Status def to_s @output end alias :to_str :to_s def to_i @status.exitstatus end alias :to_int :to_i end 我的想法是能够在尽可能多的情况下使用此对象。 将它强制转换为字符串或int会增加可用性。 例如,我可以用字符串连接对象: a_string = “Output was: ” + results (我想用这个作为int强制的例子,但Fixnum。+不喜欢它,所以它实际上不起作用:) an_int = 1 + results 到目前为止我读到的所有内容都说这可能是一个“坏”的事情。 常见的主题是这样的:“当你的对象可以表示为字符串/ int时使用to_s / to_i ,但只有当你的对象基本上是字符串/ int时才使用to_str / to_int ”。 毫无疑问,我的课程不是“根本上”字符串或int。 但是我对这个规则有一些问题: 它使我的课程不那么灵活/可用。 例如:如果我没有Status.to_str,我无法使用String。+将Status输出与其他字符串连接。 这似乎违反了鸭子打字的精神。 对象的用户(即:将其作为参数获取的方法)不应该关心该对象是什么,它应该只关心它能做什么 。 […]