设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2724|回复: 7
打印 上一主题 下一主题

[已经解决] 这算?“条件编译?”

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1050
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

跳转到指定楼层
1
发表于 2010-10-26 22:57:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
  1. if true
  2.         def a
  3.                 p 1
  4.         end
  5. end

  6. class A
  7.         if true
  8.                 def b
  9.                         p 2
  10.                 end
  11.         end
  12. end

  13. a
  14. A.new.b
复制代码
Ruby 1.9.6
  1. irb(main):001:0> if true
  2. irb(main):002:1> def a
  3. irb(main):003:2> p 1
  4. irb(main):004:2> end
  5. irb(main):005:1> end
  6. => nil
  7. irb(main):007:0* class A
  8. irb(main):008:1> if true
  9. irb(main):009:2> def b
  10. irb(main):010:3> p 2
  11. irb(main):011:3> end
  12. irb(main):012:2> end
  13. irb(main):013:1> end
  14. => nil
  15. irb(main):014:0>
  16. irb(main):015:0* a
  17. 1
  18. => 1
  19. irb(main):016:0> A.new.b
  20. 2
  21. => 2
复制代码

点评

只是觉得很方便测试,可以相当方便的注释掉一段代码【囧】  发表于 2010-10-27 01:00
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-10-26
帖子
9
2
发表于 2010-10-26 23:08:38 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1050
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
 楼主| 发表于 2010-10-26 23:09:29 | 只看该作者
回复 roxiel 的帖子


    if true啊。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-10-26
帖子
9
4
发表于 2010-10-26 23:16:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

无节操

梦石
0
星屑
607
在线时间
795 小时
注册时间
2009-2-6
帖子
3939

开拓者贵宾

5
发表于 2010-10-26 23:19:16 | 只看该作者
if true....
if false是啥结果....
Brandnew day, Brandnew Life
                              实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
6
发表于 2010-10-26 23:45:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
7
发表于 2010-10-27 00:32:42 | 只看该作者
本帖最后由 苏小脉 于 2010-10-27 03:06 编辑

概念类似,它们都是一种元编程,不过"编译"一词不妥。C/C++ 预处理指令直接影响了编译时生成的二进制代码,可以静态决定参与编译的代码内容,所以可以说是"条件编译";而 CRuby (1.9 后)代码无论如何都会先被编译为 YARV 字节码,条件只是决定了解释器"解释"与否。
如:

  1.         if false
  2.                 def foo
  3.                         p 1
  4.                 end
  5.         end
复制代码
这段代码会被编译为:
  1. == disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
  2. 0000 trace            1                                               (   1)
  3. 0002 jump             22
  4. 0004 trace            1                                               (   2)
  5. 0006 putspecialobject 1
  6. 0008 putspecialobject 2
  7. 0010 putobject        :foo
  8. 0012 putiseq          foo
  9. 0014 send             :"core#define_method", 3, nil, 0, <ic:0>
  10. 0020 leave                                                            (   1)
  11. 0021 pop
  12. 0022 putnil                                                           (   2)
  13. 0023 leave
  14. == disasm: <RubyVM::InstructionSequence:foo@<compiled>>=================
  15. 0000 trace            8                                               (   2)
  16. 0002 trace            1                                               (   3)
  17. 0004 putnil
  18. 0005 putobject        1
  19. 0007 send             :p, 1, nil, 8, <ic:0>
  20. 0013 trace            16                                              (   4)
  21. 0015 leave                                                            (   3)
复制代码
而如果是 C/C++ 预处理指令,foo 这个函数压根儿就不参与编译。预处理指令条件是静态的,在编译时确定;而 Ruby 的条件可以是动态的,在运行时确定。

点评

@moy: 已修正,感谢!  发表于 2010-10-27 03:07
所以才加了引号。。。。。  发表于 2010-10-27 00:58
moy
那个....false...  发表于 2010-10-27 00:57

评分

参与人数 1星屑 +798 收起 理由
DeathKing + 798 认可答案

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1050
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

8
 楼主| 发表于 2010-10-27 23:30:50 | 只看该作者
回复 菜鸟飞呀飞 的帖子

特殊的情况下与 define? 一起用。效果其佳,当然是在特殊的情况下。。。。。
   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 11:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表