ruby 可以在def初始化器中使用require/require_relative方法吗?

yzuktlbb  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(260)

我没有在任何文档中找到使用require方法的正确位置。我理解在脚本的最开始使用require方法是可取的,但是在初始化器类的构造函数中使用require方法是否可能?它的正确程度如何?
通常我会这样做require 'my_file'
做下面的选择有多好
class MyClass
def initialize
require 'my_file'
end
end
阅读要求方法文档

bzzcjhmw

bzzcjhmw1#

我没有在任何文档中找到使用require方法的正确位置。
“正确”的位置取决于您的要求以及您的编码风格。
在初始化器类构造函数中使用require方法是否可能?正确程度如何?
这是可能的。它是否“正确”取决于你对“正确”的定义,取决于你想做什么。
require只做三件事:
1.在加载路径中搜索文件。
1.检查文件是否已运行。
1.如果不是,请运行该文件。
这就是require的全部功能。
如果你在初始化器中require一个文件,require将 * 只 * 在你调用初始化器时运行(通常是在你示例化一个新对象时)。
如果在示例化对象之前需要文件中的一些功能,那么就不太走运了,因为require不会运行。
此外,每次示例化对象时,都要运行require,但由于require只运行文件一次,因此这只是浪费时间,因为它仍然会搜索文件并检查是否每次都运行过。
在词法上嵌套对require的调用也可能会让人感到困惑。不熟悉Ruby的人可能会认为,通过在initialize方法中使用require调用myfilemy_file中的定义可能会完全局限于initialize方法,但显然情况并非如此:require只是运行文件,它不执行任何作用域。my_file中的定义将在my_file指定的位置进行定义。
同样,审查您代码的人可能会假设 * 您认为 * 这会创建某种范围,并且现在可能会基于该假设怀疑您的代码是否存在某种bug或(更糟的)安全漏洞。
请注意,两年后,当你不知道为什么要这样写代码时,“正在审查你代码的人”很可能就是你自己。

wgmfuz8q

wgmfuz8q2#

你可以把它放在类声明之前的文件的顶部。所以你有:

require 'my_file'

class MyClass
 def initialize
 end
end
au9on6nz

au9on6nz3#

这是可能的,它将正确工作,但它是非常不寻常的。我保证这将提出问题,在代码审查。
通常,require放在文件的顶部。

gg58donl

gg58donl4#

不建议在构造函数方法中使用声明require "./file_name",因为它经常用于创建示例变量,尤其是:如果您打算使用所需文件类中的示例或全局变量作为当前类的initialize(构造函数)方法的参数,则可能会以错误结束。
你可以用这些方法require这个文件在类的顶部:

require 'my_file'

class MyClass
    def initialize
       puts "this is a constructor"
    end
end

也可以使用require在调用类之前强烈建议使用require

class MyClass
    def initialize
       puts "this is a constructor"
    end
end

require 'my_file'
object = MyClass.new
object.some_method

这允许您使用当前类中的所有示例、类、方法、对象...等等。

相关问题