Ruby - 为什么不for_each不要求小写请求?产量/自我问题?

时间:2012-02-06 19:22:19

标签: ruby yield self

其他转换工作,我需要做什么才能让D)工作正常。最终D)将是一个密码,但我想让它最初为任何函数的每个字符(最好是一个例子)。分成5个字符的桶是我正在开发的密码的一部分。

def keystream_converter(message, conversion)
  case conversion.downcase
    when 'lower_case'
      message.upcase
    when 'upper_case'
      message.downcase
    when 'special'
      message.each_char { |ltr| ltr.downcase }
    else
      'invalid_conversion'
  end
end

initial_src =  "I see Ruby going 100 years!!"
test_string = (initial_src.delete('^a-zA-Z') +"X"*(initial_src.length % 5)).scan(/.{5}/).to_s.upcase
lower = keystream_converter(test_string, 'lower_case')
upper = keystream_converter(test_string, 'upper_case')
special = keystream_converter(test_string, 'special')
#
puts "A) - " + initial_src
puts "B) - " + upper
puts "C) - " + lower
puts "D) - " + special

输出:

A) - I see Ruby going 100 years!!
B) - ["iseer", "ubygo", "ingye", "arsxx"]
C) - ["ISEER", "UBYGO", "INGYE", "ARSXX"]
D) - ["ISEER", "UBYGO", "INGYE", "ARSXX"]

3 个答案:

答案 0 :(得分:3)

String#each_char产生原始字符串长度为1的子字符串。如果您更改这些子字符串(即使使用downcase!而不是像您的情况那样非变异downcase),原始字符串也不会受到影响。如果你想使用each_char和块,你可以这样做:

message.each_char.map(&:downcase).join

答案 1 :(得分:2)

您对each_char的调用会返回原始输入字符串,而不是块的结果。

例如,如果您在irb中执行此操作:

"A STRING".each_char { |ltr| ltr.downcase }
# => "A STRING"

如果你想继续使用each_char,你应该将每个结果附加到一些你可以在之后返回的变量,即

# ...
when 'special'
  new_message = ""
  message.each_char { |ltr| new_message += ltr.downcase }
  new_message
else
# ...

答案 2 :(得分:0)

这很奇怪,但无论如何。您可以将“特殊”案例更改为:

message.each_char.map(&:downcase) * ''