1

嗨,我想知道是否有人可以向我解释为什么用下面的代码编写的 map 函数是以它的编写方式编写的。具体为什么我们需要做

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
4

3 回答 3

6

没理由; 该变量立即被丢弃。

我认为它具有误导性和不可交流性。

大部分代码看起来有点冗长,例如:

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

IMO 这将更像 Ruby-esque,因为它更接近于:

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

它可能比这更严格,或者以其他方式编写,尽管其中一些是偏好问题。例如,each_with_object可以与 shovel 运算符一起使用,但它的“功能”较少。

(我更喜欢collect收集map;我发现这种偏好更具交流性,如果更长的话。)

将功能分布在更多行上不会使事情变得可读,但这取决于上下文。刚接触 Ruby 或方法链的人可能会被(IMO 更规范的)单行代码弄糊涂。

于 2013-05-28T00:09:25.557 回答
1

正如其他人所说,它没有理由。很明显是初学者写的代码。除了 Dave Newton 的观点之外,将常量哈希定义为方法是一个坏习惯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"
于 2013-05-28T01:42:29.927 回答
0

没有功能上的原因。有时,程序员对他们的结果有一个明确的变量目的地感到更舒服。也许这是其中一种情况。与decrypted_letter 情况相同。

于 2013-05-28T00:02:56.650 回答