“放置在何处”;要求;在Ruby代码中?

“放置在何处”;要求;在Ruby代码中?,ruby,require,ruby-2.0,Ruby,Require,Ruby 2.0,我使用的是Ruby 2.0,我有两个文件:hello.rb&assets/display.rb 你好。rb: class Hello def self.run_it(name) ui = Display.new(name) ui.say_hi end end require_relative "assets/display" Hello.run_it("Someone") class Hello::Display def initialize(name = "W

我使用的是Ruby 2.0,我有两个文件:
hello.rb
&
assets/display.rb

你好。rb

class Hello
  def self.run_it(name)
    ui = Display.new(name)
    ui.say_hi
  end
end

require_relative "assets/display"

Hello.run_it("Someone")
class Hello::Display
  def initialize(name = "World")
    @name = name
  end

  def say_hi  
    puts "Hello #{@name}"  
  end
end
资产/display.rb

class Hello
  def self.run_it(name)
    ui = Display.new(name)
    ui.say_hi
  end
end

require_relative "assets/display"

Hello.run_it("Someone")
class Hello::Display
  def initialize(name = "World")
    @name = name
  end

  def say_hi  
    puts "Hello #{@name}"  
  end
end

如果在hello.rb中,我在
类hello
(第1行)之前移动
require_relative“assets/display”
ruby hello.rb
输出一个
未初始化常量
错误。为什么呢?在这个简短的示例中,当需要外部文件时,最佳实践是什么?
require\u relative
是正确的方法(vs
require
require./some\u file”
),如果在hello.rb开头包含文件display.rb,当ruby解释器遇到
类hello::display
,则,它期望
Hello
在之前的某个地方定义。但此时,类
Hello
尚未定义,因此您可以看到错误。

如果您在Hello.rb的开头包含display.rb文件,当ruby解释器遇到
class Hello::display
时,它希望
Hello
在之前的某个地方定义。但此时,尚未定义类
Hello
,因此您会看到错误。

此错误的原因是您试图在
Hello
类中定义一个类,但此时尚未定义该类。只需将名称分为两类:

class Hello
  class Display
    def initialize(name = "World")
      @name = name
    end

    def say_hi  
      puts "Hello #{@name}"  
    end
  end
end

通过这种方式,您可以同时定义两个类(稍后可以打开Hello类)

此错误的原因是您试图在
Hello
类中定义一个类,但此时尚未定义该类。只需将名称分为两类:

class Hello
  class Display
    def initialize(name = "World")
      @name = name
    end

    def say_hi  
      puts "Hello #{@name}"  
    end
  end
end

通过这种方式,您可以同时定义两个类(稍后可以打开Hello类)

标准做法是将所有或大部分require语句放在文件的顶部。文件的设计应尽可能减少对其他文件的依赖性

您遇到的问题是,您将文件
display.rb
设计为依赖于类
Hello

当你这么说的时候:

class Hello::Display
end
这与:

class Hello
  class Display
  end
end
但区别在于,在第一种情况下,需要先定义
Hello
,然后才能说
Hello::Display
。由于当您将require放在文件顶部时,
Hello
尚未定义,因此您将得到错误

您可以这样修复它:

class Hello
   class Display
     # ..your Display code here..
   end
end
# Predefine Hello as a class name
class Hello
end

class Hello::Display
  # ..your Display code here..
end
或者像这样:

class Hello
   class Display
     # ..your Display code here..
   end
end
# Predefine Hello as a class name
class Hello
end

class Hello::Display
  # ..your Display code here..
end

标准做法是将所有或大部分require语句放在文件的顶部。文件的设计应尽可能减少对其他文件的依赖性

您遇到的问题是,您将文件
display.rb
设计为依赖于类
Hello

当你这么说的时候:

class Hello::Display
end
这与:

class Hello
  class Display
  end
end
但区别在于,在第一种情况下,需要先定义
Hello
,然后才能说
Hello::Display
。由于当您将require放在文件顶部时,
Hello
尚未定义,因此您将得到错误

您可以这样修复它:

class Hello
   class Display
     # ..your Display code here..
   end
end
# Predefine Hello as a class name
class Hello
end

class Hello::Display
  # ..your Display code here..
end
或者像这样:

class Hello
   class Display
     # ..your Display code here..
   end
end
# Predefine Hello as a class name
class Hello
end

class Hello::Display
  # ..your Display code here..
end

您必须向我们展示您拥有的文件系统。@ArupRakshit谢谢,但在这种特殊情况下,它是不相关的。您必须向我们展示您拥有的文件系统。@ArupRakshit谢谢,但在这种特殊情况下,它是不相关的。感谢您的详细解释。现在有道理了。标记为被接受的答案。如果目标是在后期将代码打包为gem,您能否确认应该使用
require\u relative
而不是
require
。是
require\u relative
非常适合gem代码。但是请注意,这不是严格要求的,因为rubygems会将
lib
dir添加到加载路径中。然而,我认为这仍然是一个更好的选择,因为它减少了发生冲突的机会。你可以在这里阅读更多关于rubygems加载代码的内容:在这里你可以阅读更多关于
require\u relative
:再次感谢你。实际上,我希望我的代码在打包为gem之前能够工作(因此,现在还不在加载路径中),并且在打包时不必更改它(这看起来像是一个糟糕的模式!)。所以,要求相对符合条件:)当然。在大多数情况下(在引入require_relative之前),测试gem代码时,开发人员必须手动修改加载路径以模拟rubygems。但是就像你说的那样,在任何地方使用relative都会容易得多。这使代码自动变得更易于移植。感谢您的详细解释。现在有道理了。标记为被接受的答案。如果目标是在后期将代码打包为gem,您能否确认应该使用
require\u relative
而不是
require
。是
require\u relative
非常适合gem代码。但是请注意,这不是严格要求的,因为rubygems会将
lib
dir添加到加载路径中。然而,我认为这仍然是一个更好的选择,因为它减少了发生冲突的机会。你可以在这里阅读更多关于rubygems加载代码的内容:在这里你可以阅读更多关于
require\u relative
:再次感谢你。实际上,我希望我的代码在打包为gem之前能够工作(因此,现在还不在加载路径中),并且在打包时不必更改它(这看起来像是一个糟糕的模式!)。所以,要求相对符合条件:)当然。在大多数情况下(在引入require_relative之前),测试gem代码时,开发人员必须手动修改加载路径以模拟rubygems。但是就像你说的那样,在任何地方使用relative都会容易得多。这使得代码自动变得更加可移植。