我正在解决一个编码问题,为每个单词"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中,它们经常被不鼓励使用,仅仅是因为它们可能更难阅读/理解。如果您/当您使用它们时,请在考虑维护和可读性的情况下这样做。