Ruby 使模块中的所有类在模块中的任何位置都可用
我正在编写一个用于管理Github问题的控制台实用程序,遇到了一个Ruby 使模块中的所有类在模块中的任何位置都可用,ruby,github,module,gem,Ruby,Github,Module,Gem,我正在编写一个用于管理Github问题的控制台实用程序,遇到了一个未定义的方法错误 我的应用程序的结构如下 gissues.rb # includes all files in subfolders Gissues github.rb #Gissues::Github general github stuff commands.rb #Gissues::commands subclass of Thor (whatisthor.com), general command st
未定义的方法
错误
我的应用程序的结构如下
gissues.rb # includes all files in subfolders
Gissues
github.rb #Gissues::Github general github stuff
commands.rb #Gissues::commands subclass of Thor (whatisthor.com), general command stuff
cli.rb #subclass of commands, lists command shortcuts and subcommands
commands
user.rb #Command::User subclass of Gissues::Commands holds logic for github user related commands like signin, signout, whoami
github
user.rb #Github::User subclass of Gissues::Github holds logic for communicating with github for authentication (checking credentials)
我在Github文件夹内的user.rb中定义了与Github通信的方法。我想在commands文件夹中定义的user.rb中使用这些方法,但当我这样做时,它似乎超出了范围,我得到了一个methodnotdefined错误
user.rb(命令)如下所示
module Gissues
class Command::User < Gissues::Command
desc "signin", "Starts loging sequence"
def signin
Gissues::Github::User::request_token
end
end
end
我做错了什么?
提前谢谢
编辑:此图像可能会使结构更加清晰如果顶级模块对所有子模块都有明确的
要求
,则这不会成为问题。如果您直接加载一个底层模块,那么就不会定义其他任何东西。这就是问题所在
典型的模块如下所示:
module Gissues
require 'gissues/command'
require 'gissues/user'
end
这些需要按其依赖性的顺序列出。虽然不建议使用自动加载
来完成相同的任务,但这是可能的
只要它们都按正确的顺序装载,你就可以出发了
值得注意的是,应该将方法称为
Gissues::Github::User.request\u token
,方法前面有一个点。:
符号通常用于类名或常量,像gitsues::CONST
vs.Gissues.method\u name
你可能会显式地require\u relative'../github/user'
或者你必须在最上面的文件中command/user
之前检查github/user
是否是必需的。这样调用require
会产生误导;它使它看起来像是被限定在Gissues
范围内require
只运行文件中的代码。时期它没有涉及到任何事情。因此,将对require
的调用放在顶级,而不是放在模块或类定义表达式中,这一点更为清楚。@JörgWMittag这是首选项,它们可以放在文件的末尾。因为它们是即时评估的,所以最终结果是一样的。请注意,require
语句不能位于此处文件的顶部,因为这些子模块可能取决于定义的Gissues
。按照我的理解,不可能弄错。在这种情况下,它可能位于顶层文件的末尾,或者直接位于顶层模块定义表达式的后面。这里有很多关于StackOverflow的问题,问题是OP假设在模块定义表达式中调用require
,将以某种方式在模块内的文件中限定代码的范围。因此,这似乎是一个常见的误解,在模块定义表达式中从不编写对require
的调用有助于消除这种误解。这就是为什么我通常会避免使用它。如果在模块定义表达式中指定一个常量,该常量将成为该模块的作用域,如果在模块定义表达式中编写一个方法定义表达式,该方法将成为该模块的实例方法,如果在模块定义表达式中指定实例变量,则该实例变量将成为模块对象本身的实例变量。我可以看到这里的对称性导致了这种误解。@JörgWMittag认为require
的作用域不受限制,这对Ruby来说是非常基本的,所以如果有混淆,那是我无法控制的。当涉及到组织代码时,很多都是个人偏好。
module Gissues
require 'gissues/command'
require 'gissues/user'
end