将模块方法调用到Ruby中的另一个模块中

时间:2013-09-24 05:53:28

标签: ruby

FIle module.rb

module CardExpiry
  def check_expiry value
    return true
  end
end

文件include.rb

#raise File.dirname(__FILE__).inspect
require "#{File.dirname(__FILE__)}/module.rb"

 module Include
     include CardExpiry
  def self.function 
    raise (check_expiry 1203).inspect
  end
end

致电

Include::function

这可能吗?

调用时触发错误:

`function': undefined method `check_expiry' for Include:Module (NoMethodError)

2 个答案:

答案 0 :(得分:8)

你偶然发现了difference of include and extend

  • include使所包含模块中的方法可用于您班级的实例
  • extend使
  • 中包含的模块中的方法可用

使用self.method_name定义方法并在该方法中访问self时,self绑定到当前类。

但是,

check_expiry包含在内,因此仅在实例端可用。

要解决问题,请extend CardExpiry或使check_expiry成为类方法。

答案 1 :(得分:0)

我已经更详细地查看了您的问题,问题是您的module.rb文件:

module CardExpiry
  def self.check_expiry value
    return true
  end
end

首先,文件中缺少end - defmodule都需要关闭。

其次,self.行中的神奇def将方法转换为伪全局函数 - this answer explains it better than I can

此外,要调用该方法,您需要使用:

raise (CardExpiry::check_expiry 1203).inspect