Project1
标题:
这算?“条件编译?”
[打印本页]
作者:
DeathKing
时间:
2010-10-26 22:57
标题:
这算?“条件编译?”
if true
def a
p 1
end
end
class A
if true
def b
p 2
end
end
end
a
A.new.b
复制代码
Ruby 1.9.6
irb(main):001:0> if true
irb(main):002:1> def a
irb(main):003:2> p 1
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):007:0* class A
irb(main):008:1> if true
irb(main):009:2> def b
irb(main):010:3> p 2
irb(main):011:3> end
irb(main):012:2> end
irb(main):013:1> end
=> nil
irb(main):014:0>
irb(main):015:0* a
1
=> 1
irb(main):016:0> A.new.b
2
=> 2
复制代码
作者:
roxiel
时间:
2010-10-26 23:08
提示:
作者被禁止或删除 内容自动屏蔽
作者:
DeathKing
时间:
2010-10-26 23:09
回复
roxiel
的帖子
if true
啊。。。
作者:
roxiel
时间:
2010-10-26 23:16
提示:
作者被禁止或删除 内容自动屏蔽
作者:
moy
时间:
2010-10-26 23:19
if true....
if false是啥结果....
作者:
菜鸟飞呀飞
时间:
2010-10-26 23:45
提示:
作者被禁止或删除 内容自动屏蔽
作者:
苏小脉
时间:
2010-10-27 00:32
本帖最后由 苏小脉 于 2010-10-27 03:06 编辑
概念类似,它们都是一种元编程,不过"编译"一词不妥。C/C++ 预处理指令直接影响了编译时生成的二进制代码,可以静态决定参与编译的代码内容,所以可以说是"条件编译";而 CRuby (1.9 后)代码无论如何都会先被编译为 YARV 字节码,条件只是决定了解释器"解释"与否。
如:
if false
def foo
p 1
end
end
复制代码
这段代码会被编译为:
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 trace 1 ( 1)
0002 jump 22
0004 trace 1 ( 2)
0006 putspecialobject 1
0008 putspecialobject 2
0010 putobject :foo
0012 putiseq foo
0014 send :"core#define_method", 3, nil, 0, <ic:0>
0020 leave ( 1)
0021 pop
0022 putnil ( 2)
0023 leave
== disasm: <RubyVM::InstructionSequence:foo@<compiled>>=================
0000 trace 8 ( 2)
0002 trace 1 ( 3)
0004 putnil
0005 putobject 1
0007 send :p, 1, nil, 8, <ic:0>
0013 trace 16 ( 4)
0015 leave ( 3)
复制代码
而如果是 C/C++ 预处理指令,foo 这个函数压根儿就不参与编译。预处理指令条件是静态的,在编译时确定;而 Ruby 的条件可以是动态的,在运行时确定。
作者:
DeathKing
时间:
2010-10-27 23:30
回复
菜鸟飞呀飞
的帖子
特殊的情况下与 define? 一起用。效果其佳,当然是在特殊的情况下。。。。。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1