Re: [閒聊] 是否有 Ruby 語法的檢查器?

看板Ruby作者 (godfat 真常)時間16年前 (2008/11/22 06:05), 編輯推噓2(207)
留言9則, 3人參與, 最新討論串2/5 (看更多)
我回文好了... 三行實在講不了什麼 @@" ※ 引述《shelary (喵小咩)》之銘言: : 標題: [閒聊] 是否有 Ruby 語法的檢查器? : 時間: Sat Nov 22 13:41:08 2008 : 不知道有沒有什麼套件是可以檢查 Ruby 語法的?? : 例如變數名稱打錯字, 實際執行時會出現 找不到這個變數(=nil) : 但如果可以事先檢查, 就可以減少很多除錯時浪費的時間了. : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 59.126.45.78 : 推 godfat:option -c 在 gcc 意思是 compile only, ruby 是 syntax 11/22 13 : → godfat:check. 不過如果是變數打錯字,這不屬於 syntax error, 11/22 13 : → godfat:恐怕還是必須等到執行時才會知道喔,這是沒辦法的 11/22 13 (不好意思 gcc option 說錯了,實際上是: -S Compile only; do not assemble or link -c Compile and assemble, but do not link ) 如推文所述,ruby -c file.rb 就是只進行 syntax check. 不過像是變數打錯,如把 params 打成 parama, 這不屬於 syntax error, 基本上,這是符合 syntax 的。systax 說的是 term 與 term 之間的關係, 例如: a = b a 是合法的 variable name, b 也是合法的 variable name, 所以這句話會翻譯成把 b 這個變數的值 assign 給 a, 整句話是合法的。 但是實際上執行時,會發生: NameError: undefined local variable or method `b' for main:Object 這個不屬於 syntax error, 如: SyntaxError.ancestors => [SyntaxError, ScriptError, Exception, Object, Kernel] NameError.ancestors => [NameError, StandardError, Exception, Object, Kernel] 前者是靜態的,是 compile time 決定的。你的程式 lexical 結構, 不會因為 runtime 而改變,所以是可以進行 syntax check. 但是後者 NameError 是 runtime 才能決定,如果你在 a = b 之前 就先寫了 b = 1; 則 a = b 並沒有錯。意思就是,compile time 無法 決定哪個 variable 是否存在,因為 ruby 的變數是不用宣告的。 反之在 static typing 的語言,如 C/C++/Java/C# 等等, 因為變數需要宣告,所以 compile 時就能決定。但其實這也不屬於 syntax error, 而是 semantics 上的錯誤,例如 type error: TypeError.ancestors => [TypeError, StandardError, Exception, Object, Kernel] 因為變數在 compile time 不存在,則無法進行 type check, 所以會在 compile time 就有錯誤。 如果你說,那為什麼不能在跑 a = b 時檢查 b 是否存在? 其實在 ruby 裡,那就完全等同於執行一次了。所以這種檢查 = 正式執行。 你需要把所有的 runtime dependency 都讀進記憶體, 這跟完全跑一次的意思其實是一樣的... 所以 ruby 才會有一說是,compile time, link time, runtime 是沒有區分的。 就像你跑 attr_reader, 這種 metaprogramming 的東西,又是在 runtime 進入 compile time, 會在這幾個階段裡面不斷轉換... 而如果是真正的 syntax error, 那光在 require 進來時,就會出錯了。 所以實際上跑 -c 的意義並沒有說很大... 要求 runtime 彈性, 等於犧牲 compile time 時所獲得的資訊。所以這種檢查是沒辦法做的。 事實上這也是在說明一件事,static typing 可以討論的事情是比 dynamic typing 要來得多很多 :s -- #!/usr/bin/env ruby [露比] /Programming (Kn|N)ight/ 看板《Ruby》 # if a dog nailed extra legs that http://www.ptt.cc/bbs/Ruby/index.html # walks like an octopus, and Welcome ~Ruby@ptt~ # talks like an octopus, then ◢█◣ http://www.ruby-lang.org/ # we are happy to treat it as http://www.ruby-doc.org/ # if it were an octopus. http://www.rubyforge.org/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

11/22 14:14, , 1F
所以我覺得良好的IDE輔助很重要阿...
11/22 14:14, 1F

11/22 14:15, , 2F
NetBean裡頭同名變數會標色,看到打完名稱沒標色就知道有問題
11/22 14:15, 2F

11/22 14:27, , 3F
之前有用了一下 Aptana, 還是嫌慢... orz NetBean 快嗎?
11/22 14:27, 3F

11/22 14:37, , 4F
6.5純Ruby版的速度我是能接受了,起碼比Eclipse快上好幾倍...
11/22 14:37, 4F

11/22 15:32, , 5F
另外就是如果中間少打了 END ..常常會找不到是那裡少打了
11/22 15:32, 5F

11/22 15:33, , 6F
執行時出錯的訊息只會說.rb的最後一行少了END @_@"
11/22 15:33, 6F

11/22 15:34, , 7F
但是完全沒辦法幫助我去找到到底是那裡少打了 END
11/22 15:34, 7F

11/22 15:36, , 8F
請善用會自己補do-end的各種工具 囧
11/22 15:36, 8F

11/22 15:37, , 9F
沒有工具也要習慣自己檢查括號之類的才對...
11/22 15:37, 9F
文章代碼(AID): #199w54V5 (Ruby)
文章代碼(AID): #199w54V5 (Ruby)