作者godfat (godfat 真常)
看板Ruby
标题Re: [闲聊] 是否有 Ruby 语法的检查器?
时间Sat Nov 22 15:56:01 2008
: ◆ From: 220.135.28.18
: → poga:所以我觉得良好的IDE辅助很重要阿... 11/22 14
: → poga:NetBean里头同名变数会标色,看到打完名称没标色就知道有问题 11/22 14
: → godfat:之前有用了一下 Aptana, 还是嫌慢... orz NetBean 快吗? 11/22 14
: → poga:6.5纯Ruby版的速度我是能接受了,起码比Eclipse快上好几倍... 11/22 14
改天试试,总觉得仰赖 TextMate 不是好事...
不过也真的找不太到比较合我意的 editor @@
: 推 shelary:另外就是如果中间少打了 END ..常常会找不到是那里少打了 11/22 15
: → shelary:执行时出错的讯息只会说.rb的最後一行少了END @_@" 11/22 15
: → shelary:但是完全没办法帮助我去找到到底是那里少打了 END 11/22 15
: 推 poga:请善用会自己补do-end的各种工具 囧 11/22 15
: → poga:没有工具也要习惯自己检查括号之类的才对... 11/22 15
其实这个问题跟坏掉的 html 在各种 browser 下显示的结果都不太一样有关。
简单地说就是,你的程式码在不平衡的状况下,parse tree 会有超过一种以上的
可能。讲白话点,就是 ambiguous, 没有人有办法知道你真正的意图,
只能用「猜测」的,而事实上猜测当然不能保证一定正确,只能逼近正确。
举个简单的例子:
def f
puts 'f'
end
def g
puts 'g'
end
f
g
写错,写成:
def f
puts 'f'
def g
puts 'g'
end
f
g
ok, 这样你觉得应该是哪里缺少 end? 很明显因为排版的关系,是 f 少了。
但实际上 ruby 不看排版,所以也可能是:
def f
puts 'f'
def g
puts 'g'
end
f
g
「至少」有这两种可能,parser 在没有其他资讯(如排版资讯)的情况下,
是没办法告诉你是在哪里缺少 end. 事实上,如果他会知道的话,
或许语言设计就应该让他帮你补上。例如 ECMA script (javascript),
他行末的 ; 就是自动帮你补上的。语言 spec 有说,如果他可以推断的话,
他会帮你补上去。当然不能推断,也就是 ambiguous 时,还是会报错误。
其实 ruby 也是 ; 可加可不加,只是 ruby 没有 spec 就是了。
可以参考这个讨论:
http://flolac.iis.sinica.edu.tw/lambdawan/node/111
里面提到了 Java 里的 . 的 ambiguous 问题。ruby 里其实也有类似问题,
像是 :: 有时候可以当成 . 的意思。之前 ruby-core 上也有讨论,
有人希望舍弃 :: 的用法,因为他造成奇怪的 ambiguous 问题,
希望 :: 只拿来当成 constant resolution, 而不考虑 method call.
不过也有人说,因为这个 :: 当成 method call, 可以做一些很神奇的事....
像是 method name 其实也可以用大写开头,所以事实上,当你说:
Object::Array
时,到底是说 Object 里的 Array constant, 还是呼叫 Object 的 Array method?
有很多东西,乍看之下好像方便,其实日後会带来更多的不便。基本上我是反对
把没关系的东西作成同一个名字。像是 Java 的 . 呼叫 class method 就很讨厌。
==
这里有一个笑话。在 Microsoft Visual C++ 6.0 里面,你少打一个 ;
他会告诉你有成千上万个 error. 千万不要相信他,看到恐怖的 errors,
第一个请怀疑少打 ; 或是 }.
好在後来的 VC++ 比较聪明了,就算他猜不到哪里少加,也不会喷上千个 errors.
gcc 也常常会有错误讯息是类似:did you forget ; ? 或是之类的。
这真的只能说尽量逼近,但没办法做到准确。
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
※ 编辑: godfat 来自: 220.135.28.18 (11/22 15:57)