Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使模块中的所有类在模块中的任何位置都可用_Ruby_Github_Module_Gem - Fatal编程技术网

Ruby 使模块中的所有类在模块中的任何位置都可用

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

我正在编写一个用于管理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 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