“放置在何处”;要求;在Ruby代码中?
我使用的是Ruby 2.0,我有两个文件:“放置在何处”;要求;在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
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
是正确的方法(vsrequire
和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都会容易得多。这使得代码自动变得更加可移植。