Ruby - почему for_each не запрашивает строчные буквы?доходность / самостоятельная выдача? - PullRequest
0 голосов
/ 06 февраля 2012

Другие конвертируют работу, что мне нужно сделать, чтобы 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 ]

3 голосов
/ 06 февраля 2012

String # each_char возвращает подстроки длиной 1 исходной строки.Если вы измените эти подстроки (даже с downcase!, а не с неизменным downcase, как в вашем случае), на исходную строку это не повлияет.Если вы хотите использовать each_char с блоком, вы можете сделать что-то вроде этого:

message.each_char.map(&:downcase).join
2 голосов
/ 06 февраля 2012

Ваш вызов 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
# ...
0 голосов
/ 06 февраля 2012

Странно, но все равно.Вы можете изменить «особый» случай на это:

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