2013-09-24 164 views
2

文件module.rb调用模块方法进入另一个模块中的Ruby

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) 
+0

你是什么意思“这是可能的?”?你试过了吗?这将是明显的检查方式。答案可能是“是”,但我不明白你为什么没有尝试过。 –

+0

我试过..但没有成功 – akdev

+0

我对上述评论表示歉意 - 我发现你确实有错误;今后请包括您看到的任何错误消息,谢谢。 –

回答

6

你绊倒的difference of include and extend

  • include使得
  • extend所包括的模块在提供给实例你的类的的方法使得所包含的模块在所述方法中在类可用

当定义用的方法self.method_name并且您在该方法内访问selfself被绑定到当前类。

check_expiry,但是,包括在内,因此只能在实例端使用。

若要解决问题或者extend CardExpiry或使check_expiry类方法。

+0

正确答案..谢谢:) – akdev

0

我看更详细一点的问题,这个问题是你module.rb文件:

module CardExpiry 
    def self.check_expiry value 
    return true 
    end 
end 

首先,有一个end文件丢失 - 需要关闭defmodule

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

此外,要调用的方法,你需要使用:

raise (CardExpiry::check_expiry 1203).inspect 
+0

是啊,这种方式工作:) ..但我想mixin行为 – akdev

相关问题