为什么这个Ruby代码使用char.upcase!失败,但 char = char.upcase 有效



我正在解决一个编码问题,为每个单词"LiKe ThIs"做一个有趣的案例。这是我的一个衬里解决方案。我知道这有点笨拙,但哦,好吧。

string.split(" ").map{|word| word.split("").map.with_index{|char,i|
  i.even? ? char.upcase! : char.downcase! }.join("")}.join(" ")

这是输入hello there test的输出HLO TEE TS,使其看起来只有偶数情况在发射。但是在将打印语句放入其中时,我可以看到是的,它正在通过每个索引。

在沮丧中,我将其更改为:

 string.split(" ").map{|word| word.split("").map.with_index{|char,i|
   i.even? ? char = char.upcase : char = char.downcase }.join("")}.join(" ")

我觉得这应该是等效的 - 将 char.upcase! 更改为 char = char.upcase...神奇的是,这奏效了。

这是怎么回事?

这是

由于upcase!downcase!的定义。这是案例!

上调 str 的内容,如果未进行任何更改,则返回 nil。注意:大小写更换仅在 ASCII 区域有效。

请注意,如果未进行任何更改,它将返回nil。在这种情况下,如果您要迭代的字符已经采用正确的大小写,它将返回nil并有效地从字符串中删除该字符,作为map函数的一部分。

在您的特定示例中,您会注意到所有其他字符都被删除了,因为它已经是小写的,并且downcase!返回nil

考虑更清楚地编写代码:

string = 'foo bar'
string.split.map{ |w|
  w.split('').map.with_index{ |char, i|
    i.even? ? char.upcase : char.downcase 
  }.join
}.join(' ')
# => "FoO BaR"

或者,甚至像这样:

string.split.map{ |w|
  w.split('').map.with_index{ |char, i|
    if i.even? 
      char.upcase 
    else
      char.downcase 
    end
  }.join
}.join(' ')
# => "FoO BaR"

应谨慎使用三元语句。在像C和Perl这样的语言中,你会发现它们经常被使用,但在Ruby中,它们经常被不鼓励使用,仅仅是因为它们可能更难阅读/理解。如果您/当您使用它们时,请在考虑维护和可读性的情况下这样做。

最新更新