【问题标题】:Ruby - why doesn't for_each not do the lower case requested? yield/self issue?Ruby - 为什么 for_each 不要求小写?产量/自我问题?
【发布时间】:2012-02-28 06:30:15
【问题描述】:

其他皈依者工作,我需要做什么才能让 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"]

【问题讨论】:

    标签: ruby yield self


    【解决方案1】:

    您对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
    # ...
    

    【讨论】:

    • +1 我喜欢这个答案开头的非常英语的 1 句。我基本上希望我能将它与我接受的来自 Alex 的那个结合起来,因为他们都提出了很好的观点。
    • 这也是我将实际使用的选项,因为现在编写一组更复杂的操作看起来更容易,而不仅仅是'downcase'
    【解决方案2】:

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

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

    【讨论】:

    • 或者换句话说,ltr 是数据的副本,更改它对原始数据没有影响。
    • +1 已接受。最后这是我最喜欢的,虽然我也喜欢 BaronVonBraun 的(几乎和我喜欢他的名字一样多;))。
    • 这个答案很关键,因为它提到了“收益”,这是这个问题/答案中理解控制在哪里的关键概念。 map 是满足这些需求的绝佳选择,.join(或+= 甚至<<result << message.each_char.map(&:downcase).join 一样收集它们
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2023-01-28
      • 2012-07-07
      • 2012-06-12
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多