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

为什么这个Ruby代码使用char.upcase!失败,但char=char.upcase有效吗?,ruby,string,uppercase,lowercase,Ruby,String,Uppercase,Lowercase,我正在解决一个编码问题,为每个单词做一个有趣的案例,“像这样”。这是我的一行解决方案。我知道这有点不对劲,但哦,好吧 string.split(" ").map{|word| word.split("").map.with_index{|char,i| i.even? ? char.upcase! : char.downcase! }.join("")}.join(" ") 这是为输入hello there测试输出HLO TEE TS,使其看起来像是只有偶数的情况下才会触发。但是当我把一个

我正在解决一个编码问题,为每个单词做一个有趣的案例,“像这样”。这是我的一行解决方案。我知道这有点不对劲,但哦,好吧

string.split(" ").map{|word| word.split("").map.with_index{|char,i|
  i.even? ? char.upcase! : char.downcase! }.join("")}.join(" ")
这是为输入
hello there测试输出
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的定义
停机。这是

更新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中,它们的使用通常是不被鼓励的,因为它们可能更难阅读/理解。如果/当您使用它们时,请记住维护和可读性。

作为说明,在第二段代码中,您不需要将
char.upcase
chat.downcase
分配给变量
char
。简单地返回它们也可以(
i.even??char.upcase:char.downcase
)谢谢Marc,我把upcase弄混了!vs upcase,并映射自动分配它。还有锡人-真的吗?格式问题的答案与我的评论和“大男子主义代码”无关?我是一个女人,为了好玩,我解决了一些Ruby问题,用这种语言重新熟悉自己。我发现你的评论令人反感,我把它标记为“男性代码”与性别无关。这是一种代码条件,当人们试图使用深奥的知识来做一些棘手的事情,使实际的处理过程变得混乱。这是Perl和C语言中的一个常见问题,在Perl和C语言中,人们编写的代码非常简洁,结果对于每个需要编写代码的人来说都是难以理解的。模仿这一点不是一件好事。我仍然对术语感到不舒服。但关于三元语句,我想你们是说它们在C/Perl中某种程度上是“OK”的,而不仅仅是因为它们被更广泛地使用。我很感谢您的反馈-不会在生产环境中使用类似的东西!但对于我自己来说,重新学习Ruby,只是想把事情做好。谢谢:)另外,我不知道为什么这个问题会被否决,但是任何否决这个问题的人,请记住——我已经好几年没有编程了,我希望有一个不带评判性的地方来提问和学习。有些人否决了这个问题,因为他们得到了一整袋的问题,并且认为传播这些问题是有用的,不明白的是,他们使用的每一台电脑,都会被系统自动获取。而且,如果他们恶意使用它们,系统将回滚他们的选票并对他们进行攻击。不要太担心他们;只要问一些有用的、经过深思熟虑的问题,投票结果就会出来。虽然我相信你的意思是好的,但这并不是对我问题的回答。虽然这是一个简单的Ruby问题,只是为了更新我的技能,但我对它非常熟悉,知道Ruby中的OneLiner非常常见,随之而来的是三元语句。它通过显示正确的方法来回答问题。在代码最里面的
map
中指定
char
,没有任何效果,并且可能会在嵌套级别导致进一步的混乱。保持内部的
map
尽可能简单总是有助于保持事物的正常。而且,一旦多行或嵌套的
map
工作正常,就很容易创建一个单行。只需移除线端;经常试图用一行来写会让人困惑。这是我在工作中指出的情况;从简单开始,让它工作,然后根据需要减少。你发布了一个答案,但你没有像其他解决方案那样花时间解释,只提到了格式。我非常感谢您的反馈,但是如果您专注于这个问题,然后添加格式问题作为事后思考,这会有所帮助-谢谢!另一个问题已经被选为答案,因此似乎不需要为纠正错误提供额外的澄清。我已经做了很长一段时间了,所以我不担心我是否得到了“获胜的答案”。我更关心的是长期教育,而不是得分。