如何声明需要包含ruby模块

时间:2017-08-18 15:51:42

标签: ruby module

Ruby没有接口,但是如何告诉其他程序员需要在类中包含当前模块,比如实例变量,方法,常量等?

3 个答案:

答案 0 :(得分:2)

无法正式定义所需内容,您可以清楚地记录下来。原因是Ruby在设计上非常动态,因此静态测试不起作用,它们检测到的问题可能会在代码实际执行时得到纠正。同样,一些看似正确的东西可能会被其他代码破坏。

C ++,Java,甚至Objective-C和Swift都可以进行编译时检查来强制执行这些操作。一旦定义了类,就不能定义它。创建方法后,无法删除它。在像Ruby这样的Smalltalk派生语言中并非如此。

Ruby没有能力预先测试这些东西,因为程序实际执行的操作可能会在代码加载和解析时以及实际执行代码时发生根本变化。

如果你有一个特别复杂的足迹,你可能想要编写一个测试它的方法,可以运用它来验证一切正常。只要程序员认为他们已经准备就绪,就可以调用它。

验证Ruby代码是否正常运行的唯一方法是运行它。没有多少静态分析能够接近它。

答案 1 :(得分:1)

Ruby核心库中存在一些具有完全相同问题的mixins,类和方法,例如: EnumerableComparableRangeHashArray#uniq:他们需要来自其他对象的某些行为才能工作。一些例子是:

  • Enumerable

      

    该类必须提供方法each,该方法生成集合的连续成员。如果使用Enumerable#max#min#sort,则集合中的对象还必须实现有意义的<=>运算符[...]

  • Comparable

      

    该类必须定义<=>运算符,该运算符将接收器与另一个对象进行比较,返回-1,0或+1,具体取决于接收器是否小于,等于或大于另一个对象。如果另一个对象不具有可比性,则<=>运算符应返回nil。

  • Range

      

    可以使用可以使用<=>运算符进行比较的任何对象构建范围。将范围视为序列(#each和从Enumerable继承的方法)的方法期望 begin 对象实现succ方法以返回下一个对象序列。 stepinclude?方法需要开始对象来实现succ或数字。

  • Hash

      

    如果覆盖hasheql?方法以提供有意义的行为,则可以将用户定义的类用作哈希键。

    并且为了定义什么&#34;有意义的行为&#34;表示Hash的文档进一步链接到Object#hashObject#eql?的文档:

  • Object#hash

      

    [...]此函数必须具有a.eql?(b)隐含a.hash == b.hash的属性。 [...]

  • Object#eql?

      

    [...]如果 obj 其他引用相同的哈希键,eql?方法将返回true。 [...]

所以,正如你所看到的,你的问题很常见,答案是:文档。

答案 2 :(得分:0)

这是一个主观的问题,所以记住这是我的观点。

也许你可以创建一个你的对象继承的基类。

例如:

class BaseA
  def say(msg)
    raise NotImplementedError
  end
end

class A < BaseA
 def say(msg)
  puts "saying #{msg}"
 end
end

即使这不是一个真实的界面,你也可以假装&#34;它是一个并拥有所有需要BaseA方法的类,然后用真实行为覆盖它们。然后我想开发人员可以只看一下基类来看看需要实现哪些方法。