讓多餘的標記選用

lua-users home
wiki

Lua 需要在一個if 語句後跟著 'then',而在一個 while 以及 for 語句後跟著 'do'。這些完全是多餘的,我建議讓它們變成選用的。它們加重了我們肌腱不必要的磨損,讓代碼更難讀(眼睛比較容易辨別開頭和結尾)。沒有它們,代碼會更簡潔,更容易讀

  local n = 10
  if n > 5
    for i=1,n
      local x = n
      while x > i
        x = x - 1
        io.write(x)
      end
      io.write('\n')
    end
  end

這是 Lua 代碼的一項小改動(LuaPowerPatches),增加 Lua 的效能(微不足道,但可以證實),且完全向後相容。

我發現有 dothen 比較好讀。你讀的時候可以比較容易掃視。比較容易看出區塊的開頭和結尾,而且你會知道一個範圍是在 doend 之間。你不需要評估表達式,來看它們是否完整(例如因為結尾的分號是選用的)。當然可以加括弧來保證表達式是完整的,但這樣一來它們又是選用的和多餘的了。——NDT

不覺得比較好讀。

首先,在寫得好的 C/Pascal/Lua/... 中,要辨識區塊很難,感謝縮排。Python 甚至將縮排當做區塊範圍的唯一指標。它確實有效。

說實話,我發現很難相信你會去找 'then' 和 'do' 關鍵字,來看區塊的開頭在哪裡。我的眼睛會掃描代碼的左側來決定區塊的結構,將 'if', 'for' 和 'while' 語句與它們相對應的 'end' 語句配對,單純透過縮排來做。只有有錯誤時,某些地方會讓我懷疑縮排有誤導性,我才開始掃描代碼的右側

當然,我不會在每一行放好幾個語句。也許如果我做了,我就會被迫養成忽略縮排、掃描分隔符號的習慣,才能找出我代碼的結構。但我比較喜歡一致地設定代碼的格式,相信這樣可以讓辨識更輕鬆。

所以,區塊結構透過一致的格式變得透明後,我們還可以如何幫助快速辨識呢?把一個語句的重要部分放在一行的開頭和結尾,那裡眼睛最容易看到它們。選擇好的變數名稱也套用相同的原則

  foobar1
  foobar2
  
優於
  foo1bar
  foo2bar
  
同樣地
  if a
  if e
  
優於
  if a then
  if e then
  
即使你不同意,只想把它歸咎於品味問題,我還是不認為為什麼它不應該變成選用的。它完全不會傷害 Lua。——EricTetz

我也不覺得有 "then" 標記的 lua 代碼更好讀。把它變成選用的,沒什麼正當理由不這麼做。——DanHollis?

同意。如果可以的話,我希望可以像在 Python 或 Ruby 中寫「def」,而不是「function」——它比較簡短。——YuraSokolov

我發現當有多個條件時,then 簡潔易讀,例如:

  if
    (cond1 == val1) and
    (cond2 ~= val2) or
    (cond3 <= val3)
  then
    -- code block
  end
為了語法的連貫性,我投票贊成保留它。但另一方面,您也可以對省略的括號說同樣的話——SajberToffe


雖然 then 在 Lua 4 中完全是多餘的,但當語法更改為允許呼叫和賦值語句以括弧的表達式開頭時,這種情況就有所改變;此變更表示 ; 語句終止符僅半選擇性地出現。以下沒有 then 就無法寫出來,因為 ; 只出現在語句後面;沒有 then,它會模稜兩可
  if x then (funcs[x] or default_func)() end

而且,doforwhile 語句中不能是選擇性的,因為區塊本身可以以 do 語句開始

  while x > 100 do
    do 
      local y = f(x)
      g(y)
      h(y)
    end
    -- ...
  end

上述程式碼限制 y 的生命週期,如果 y 是巨集物件,並且 while 迴圈的剩餘部分相當耗時的話,這可能會很有用。

如果 do 不能是選擇性的,則唯一明確的可能性是強制或禁止;如果它是禁止的,那麼在 if 語句中註明的模糊性將無法解決。

C 必須以 ( ) 將條件包圍,並使用 { } 而不是 do/thenend 來解決在條件式後面加上語句的模糊性;它還要求語句以 ; 結尾。最後,它幾乎是一種大同小異——相對吸引力取決於您是否偏愛標點符號而不是英文單字。


RecentChanges · preferences
edit · history
上次編輯時間:2005 年 12 月 24 日上午 6:58 GMT (diff)