.join一个数组输出

时间:2013-07-22 13:37:13

标签: ruby

我正在构建一个输出到数组而不是字符串的基本加密器。我猜我需要使用.join方法但是因为我的生活无法找到答案,而不会出错。

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
   end

   def encrypt(string)
     letters = string.split("")

     letters.collect do |letter|
       encrypted_letter = encrypt_letter(letter)
     end
   end

end

2 个答案:

答案 0 :(得分:2)

您可以通过记住方法中评估的最后一个值也是返回值来收紧encrypt_letter方法。

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

Encryptor.new.encrypt_letter('h') #=> "u"

此外,collect方法实际上将返回块返回的所有值的数组(块评估的最后一个值),因此无需将其分配给块中的变量。由于您拥有来自collect的数组(这只是所有加密的字母,请在其上调用join(因为这是方法中的最终评估,它是返回值)。

def encrypt(string)
  letters = string.split("")

  letters.collect {|letter| encrypt_letter(letter) }.join
end

Encryptor.new.encrypt("Hello") #=> "uryyb"

从技术上讲,你甚至可以删除letters变量并在一行中完成所有操作,但我个人认为这种方式更具可读性。

<强> IMHO:

您可能可以创建所有方法类方法,因为您没有存储任何实例变量,并且似乎没有任何理由在仅加密字符串之外保留它。

答案 1 :(得分:1)

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 = cipher[letter.downcase] #each letter passed is crypted here
   end

  def encrypt(string)
    letters = string.split("")

    encrypted_letter = []  #define an array to store each encrypted char

    letters.collect do |letter|          
      encrypted_letter << encrypt_letter(letter) #accumulate encrypted chars in the array
    end
    encrypted_letter.join #now time to use join to form a string and return it
  end
end

Encryptor.new.encrypt("something") #=> "fbzrguvat"