【问题标题】:Ruby - How does this each iterator work?Ruby - 每个迭代器如何工作?
【发布时间】:2015-06-24 00:39:46
【问题描述】:

我遇到了这个反转字符串的迭代器。我试图分解它以了解它在做什么,但似乎并没有走得更远。

2.0.0-p643 :053 > s1 = "reverse"
 => "reverse" 
2.0.0-p643 :054 > (0...(s1.length/2)).each {|i| s1[i],s1[s1.length-i-1]=s1[s1.length-i-1],s1[i]}
 => 0...3 
2.0.0-p643 :055 > s1
 => "esrever"

有人可以帮我分解迭代的每个部分吗?

2.0.0-p643 :056 > (0...(s1.length/2))
=> 0...3 

第一个对象只给我 0..3。它是如何遍历整个单词的?

为什么在迭代中需要 s1[i] 两次?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这并不是那么复杂——大部分只是被格式所掩盖。如果你把它写成多行,它看起来像这样:

    (0...(s1.length/2)).each do |i|
        s1[i], s1[s1.length-i-1] = s1[s1.length-i-1], s1[i]
    end
    

    如果你不习惯多重赋值,你可以用一个临时变量进一步分解它:

    (0...(s1.length/2)).each do |i|
        temp = s1[i]
        s1[i] =  s1[s1.length-i-1]
        s1[s1.length-i-1] = temp
    end
    

    它遍历左半部分,并将每个字符与右半部分的相应字符交换(第一个与最后一个,第二个与倒数第二个等)。

    【讨论】:

    • 当你把它写成多行并写“多重赋值”时,我突然变得很明显。起初看它根本没有意义。 Ruby 总是让我用这样的格式来绊倒我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2014-01-20
    • 2012-08-28
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多