中间步骤的局部变量

时间:2013-05-27 23:56:40

标签: ruby local-variables

嗨我想知道是否有人可以向我解释为什么用以下代码编写的地图函数是按照其编写的方式编写的。具体为什么我们需要做

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

3 个答案:

答案 0 :(得分: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可以与铲运算符一起使用,但这不是“功能”。

(收集时我更喜欢collect而不是map;如果时间更长,我会更喜欢沟通。)

在更多行上传播功能并不会使事情变得可读,但这取决于上下文。对Ruby或方法链接不熟悉的人可能会被(IMO更规范的)单行混淆。

答案 1 :(得分: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"

答案 2 :(得分:0)

没有功能原因。有时程序员会觉得为结果提供明确的变量目标会更加舒适。也许这是其中一个案例。与decrypted_letter案例相同。