如何像在C或C+中那样拆分Ruby代码+;密码
我想将一长段Ruby代码拆分为多个Ruby源文件。在C源文件中,我可以这样放置代码: a.c如何像在C或C+中那样拆分Ruby代码+;密码,ruby,Ruby,我想将一长段Ruby代码拆分为多个Ruby源文件。在C源文件中,我可以这样放置代码: a.c 开关(n){ 案例1: printf(“1\n”); 打破 #包括“b.c” } b.c 案例2: printf(“2\n”); 打破 在Ruby中,我不能这样做: a.rb 案例n 当1 把“1” 加载“b.rb”或包含 终止 b.rb 当2 把“2” 如何像在C源文件中一样在Ruby代码中编写它?在Ruby中使用方法load时,解释器读取并执行整个文件。但它本身应该是有效的语法 例如,您可以
开关(n){
案例1:
printf(“1\n”);
打破
#包括“b.c”
}
b.c
案例2:
printf(“2\n”);
打破
在Ruby中,我不能这样做:
a.rb
案例n
当1
把“1”
加载“b.rb”或包含
终止
b.rb
当2
把“2”
如何像在C源文件中一样在Ruby代码中编写它?在Ruby中使用方法
load
时,解释器读取并执行整个文件。但它本身应该是有效的语法
例如,您可以这样做:
file1.rb:
puts 'I am in file1'
file2.rb:
case condition
when "a"
load 'file1.rb'
when "b"
puts 'I am in main file'
end
但我不建议这样做。最好将代码拆分为有意义的类/模块,然后在需要时需要文件/包含模块
Ruby非常支持OOP,因此您可以利用它Ruby是一种完全面向对象的语言。即使在文件顶部编写代码,它实际上也会在
对象
对象中运行
实际上拆分一个显然是必需的过程代码的最简单方法是将代码放在其他地方的方法中,这样它就得到了一个名称空间
针对您的案例的一种解决方案是:
# a.rb
require_relative 'b'
case condition
when "a"
puts "a"
when ->(it) { B.handle?(it) }
B.handle(condition)
end
# b.rb
module B
def self.handle?(cond)
"b" === cond
end
def self.handle(cond)
case cond
when "b"
puts "we are in b.rb"
end
end
end
这闻起来像个X-Y问题。在Ruby中,你想做的是不可能的。您想要在Ruby中实现的内容很可能是可行的,但是您需要告诉我们您想要实现的内容。C的
#include
是一个预处理器指令,它会在编译之前将行替换为给定的源文件。Ruby没有这种包含机制。@Stefan,除非您使用像ERB这样的东西。我已经更改了您的示例代码,使C和Ruby代码片段更相似。希望我没有改变你问题的意思。顺便说一句,我不认为以这种方式拆分你的C代码(或任何代码)是一个好主意。拆分逻辑单元会使您的代码更难阅读/理解/维护。OP还想将when
-部分提取到另一个文件中。不清楚“第一个文件的有效语法”是什么意思。@Stefan我的意思是,when…
在隔离时无效,在案例中有效。。。end
@sawa这也是我的意思:-)如果ruby-cfile1.rb
说“语法正常”,你也可以说你可以加载一个文件,而不必得到SyntaxError
。在任何情况下,每个文件本身都必须在语法上有效,因此您不能将表达式分解成更小的片段,然后以这种方式进行组装。@Stefan:它不仅需要在语法上有效,还需要在语义上有效load
和require
只需运行文件即可。没别的了。因此,文件必须是可运行的、可工作的、有效的、正确的Ruby代码。我不认为面向对象与在主/对象环境中执行的包含代码相关。在我看来,这是相关的,因为显然是“在顶层”编写的代码实际上是“在某个对象中”运行的。如果不理解这一点,OP就会认为可以像包含C代码一样包含文件。