2013-05-27 71 views
1

嗨我想知道是否有人可以向我解釋爲什麼寫在下面的代碼中的地圖函數是寫在它的書面方式。具體爲什麼我們需要做的在中間步驟的局部變量

results = letters.map do |letter| encrypted_letter = encrypt_letter(letter) 

,而不是僅僅做

results = letters.map do |letter| encrypt_letter(letter) 

class Encryptor 
    def cipher 
    {"a" => "n", "b" => "o", 'c' => 'p', 'd' => 'q', 
      'e' => 'r', 'f' => 's', 'g' => 't', 'h' => 'u', 
     'i' => 'v', 'j' => 'w', 'k' => 'x', 'l' => 'y', 
     'm' => 'z', 'n' => 'a', 'o' => 'b', 'p' => 'c', 
     'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g', 
     'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 
     'y' => 'l', 'z' => 'm'} 
    end 

    def encrypt_letter(letter) 
     lowercase_letter = letter.downcase 
     cipher[lowercase_letter] 
    end 

    def encrypt(string) 
     letters = string.split("") 
     results = letters.map do |letter| 
      encrypted_letter = encrypt_letter(letter) 
     end 
     results.join 
    end 

    def decrypt_letter(letter) 
     lowercase_letter = letter.downcase 
     cipher.key(lowercase_letter) 
    end 

    def decrypt(string) 
     letters = string.split("") 
     results = letters.map do |letter| 
     decrypted_letter = decrypt_letter(letter) 
     end 

     results.join 
    end 

end 

回答

0

有沒有爲它功能上的原因。有時程序員覺得他們的結果有一個明確的變量目的地,因此更加舒適。也許這是其中的一種情況。與解密的信件一樣。

+0

好,謝謝。我試圖弄清楚它的相當一段時間 – JaTo

+2

「有時程序員覺得他們的結果有一個明確的變量目的地,更舒服。」?我會更簡單地說:寫它的人不知道「地圖」是如何工作的,而且寫得過於冗長。中間變量有它們的位置,但不應該指定爲只能使用一次。 @ Tinman ...... –

+0

......我沒有任何建議,這是很好的做法。我只是在做一個觀察,並且有點舌尖。我不會完全假定程序員腦子裏發生了什麼。 – lurker

6

沒理由;該變量立即被丟棄。

我認爲這是誤導和不通透的。

大部分的代碼似乎有點冗長,例如:

def encrypt(string) 
    letters = string.split("") 
    results = letters.map do |letter| 
     encrypted_letter = encrypt_letter(letter) 
    end 
    results.join 
end 

IMO這將是更紅寶石去年秋季的東西更接近:

def encrypt(str) 
    str.chars.collect { |c| encrypt(c) }.join 
end 

這可能是比更緊,或以其他方式書寫,儘管其中一些是偏好問題。例如,each_with_object可以與鏟運營商一起使用,但這不太「功能性」。

(我喜歡collectmap收集時,偏好,我覺得更多的溝通,如果更長的時間。)

超多行不使事情可讀的傳播功能,但它依賴於上下文。 Ruby的新手或方法鏈可能會被(國際海事組織比較規範的)單線程混淆。

+0

偉大的答案!在哪些情況下,我應該使用「地圖」更具溝通性?到目前爲止,我一直只用它來收集 – JaTo

+0

@JamieS就像我說的那樣,這是個人喜好 - 'map'是一個衆所周知的構造,我只是在'each'的意義上找到更接近的意思,所以當我'我積極收集結果,我喜歡「收集」。我的偏好沒有技術上的理由,我可能會選擇少數。我只是想解釋爲什麼我在我的例子中使用它:) –

+0

+1。同意。嚴密的代碼是可讀的,不會浪費時間完成任務。爲單次使用指定一箇中間值不會提高可讀性,相反,這意味着不確定代碼將執行什麼操作,併爲人工可讀性帶來空氣,但會導致視覺混亂。 –

1

正如別人所說,它沒有理由。這顯然是一個初學者編寫的代碼。除了戴夫牛頓的觀點之外,將恆定散列定義爲方法cipher是一種壞習慣。每次調用代碼時,都會創建一個新的散列。這對每封信都必須完成。這是一個巨大的資源浪費。

使用哈希,你可以簡單地這樣做:

h = {"a" => "n", "b" => "o", 'c' => 'p', 'd' => 'q', 
    'e' => 'r', 'f' => 's', 'g' => 't', 'h' => 'u', 
    'i' => 'v', 'j' => 'w', 'k' => 'x', 'l' => 'y', 
    'm' => 'z', 'n' => 'a', 'o' => 'b', 'p' => 'c', 
    'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g', 
    'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 
    'y' => 'l', 'z' => 'm'} 
h.default_proc = ->x{x} 

"hello world".gsub(/./, h) 
# => "uryyb jbeyq" 

但我寧願這個去:

from = "abcdefghijklmnopqrstuvwxyz" 
to = "nopqrstuvwxyzabcdefghijklm" 

"hello world".tr(from, to) 
# => "uryyb jbeyq"