Ruby 语法设计上的缺陷(未完待续)_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > Ruby 语法设计上的缺陷(未完待续)

Ruby 语法设计上的缺陷(未完待续)

 2013/6/19 11:15:58  jamcode  程序员俱乐部  我要评论(0)
  • 摘要:1、Ruby的多行注释"=begin=end"不能缩进,必须出现在行首,使它变得一点不实用。看看Rails的代码,根本不使用=begin=end格式的多行注释,只使用"#"注释,可见"=begin=end"注释,压根没有用处。2、Ruby的多行注释"=begin=end"不能嵌套。支持嵌套的多行注释用起来更方便3、if语句的then关键字实属多余。分隔condition与当条件为真时执行的语句块的方式现在有三种:then,分号,换行符。并且这三种方式可以同时出现
  • 标签:Ruby 设计
1、Ruby的多行注释"=begin =end"不能缩进,必须出现在行首,使它变得一点不实用。看看Rails的代码,根本不使用=begin =end格式的多行注释,只使用"#"注释,可见"=begin =end"注释,压根没有用处。


2、Ruby的多行注释"=begin =end"不能嵌套。支持嵌套的多行注释用起来更方便


3、if语句的then关键字实属多余。分隔condition与当条件为真时执行的语句块的方式现在有三种:then,分号,换行符。并且这三种方式可以同时出现:
class="ruby" name="code">
    if ruby=='good' then;
        p 'Ugly!Actually!'
    end

甚至可以这样写:
    if ruby=='good'; then;   #then前面的分号证实then其实只是一个弃儿
        p 'Ugly!Actually!'
    end

如果认为then作为分隔能使代码更易读,那应该从设计上将then作为唯一的分隔方式,而不是可选的方式。

4、同样,while语言的do关键字也是多余的!但这次Ruby的规则又不一样,你可以写出这样的代码:
    while true do;
        p 'jex.im'
    end
    while true
        p 'jex.im'
    end

却不能像then那样写:
    while true;do #语法错误,原因在于do关键字同时又可用来表示do block ,所以分号后的do有歧义
        p 'Ruby!'
    end

可见do关键字应该只用来表示do block,不应在while中使用引起歧义。
另外,while循环没有必要为紧凑写成单行,并且压根不需要将while当成表达式使用,如:
a= while i>0 do p i  end #只有当while要写成单行时才需要do关键字,但仍然可以将do换成分号。
while i>0; p i;end

The `do` keyword in while statement is useless.

5、当在很多语言中都把`from module import *`当成Bad practise时,
(`from module import *`的方式会一下子引入不必要的变量,当在大段代码中看到一个变量foo时,本以为它是在当前文件中哪个地方定义的,但search之后压根找不到,后来才发现原来foo是module.foo,在`import *`时被引入了。这样就给代码阅读带来了些困难。),
Ruby require却只有import *这一种选择竟然!根本原因在于Ruby中的module是与rb文件无关的,没有将一个文件当成一个module。
Ruby看似有module及mixin等很多灵活强大的东西,但却在模块的引入方式上落后于Java、Python,只相当于PHP中的require。将模块/命名空间与文件/文件夹一一对应,不但便于项目文件组织,而且对于module的查找也非常方便,知道module名称,直接可以知道它的文件路径,反之亦然。而Ruby的require方式,事实上相当只是一个read file once然后eval。其坏处显而易见,如下:
require "base64"  #一个lib文件,我不能将它称之为模块还,文件名是base64.rb
puts Base64.methods()  #而实际上,要使用这个lib,却是用的Base64这个module名称

假设foo.rb内容如下(尽管它不是一个好的practise)
def foo
    puts "jex.im"
end
def bar 
    puts "http://jex.im/"
end
# module Foo
#     puts "Ruby的rb文件太落后"
# end

使用foo.rb的代码如下
require "foo"
def bar  #压根没预料到foo.rb里面会有一个叫bar的东西
    p "Ruby pa pa pa"
end

就会出现警告: warning: method redefined; discarding old foo
Ruby的require功能如此简单,只能依靠于约定,一个rb文件里面必需是一个module定义,不允许在rb文件顶层定义函数及变量等。
说到底,Ruby中不存在module import/include方法,只存在加载文件并eval方法!





jex.im
发表评论
用户名: 匿名