Ruby方法来反转字符串输入

时间:2014-11-06 02:02:50

标签: ruby string reverse

我不明白为什么revers_string = string [i] + reversed_string将最后一个char放在第一位。似乎string [i]将索引第一个char而不是最后一个。所以,如果字符串是" abc"索引0将是' a'而不是' c。有人可以解释红宝石是如何得到的' c'从索引0?然后,当然,' b'从索引1?等等。

  

编写一个将字符串作为输入的方法,并以相反的顺序返回一个具有相同字母的新字符串。

     

难度:容易。

def reverse(string)
  reversed_string = ""

  i = 0
  while i < string.length
    reversed_string = string[i] + reversed_string

    i += 1
  end

  return reversed_string
end
puts("reverse(\"abc\") == \"cba\": #{reverse("abc") == "cba"}")
puts("reverse(\"a\") == \"a\": #{reverse("a") == "a"}")
puts("reverse(\"\") == \"\": #{reverse("") == ""}")

3 个答案:

答案 0 :(得分:5)

reversed_string = string[i] + reversed_string

例如,如果string"abc",则string[0]确实为"a",但此处将其放入开头 reversed_string,而不是结束。 reversed_string在每次迭代中加起来为:

"a" + ""     #string[0] + ""  => "a"
"b" + "a"    #string[1] + "a" => "ba"
"c" + "ba"   #string[2] + "ba"=> "cba"

答案 1 :(得分:0)

假设你不能使用Ruby Class String内置的 Reverse 方法,你可以尝试以下

def reverse_string(string)
  new_string = []
  i = string.length-1
  while i >= 0
    new_string.push(string[i])
    i -= 1
  end
  new_string.join
end

这将创建一个新的字符串对象,但它将在不使用任何内置方法的情况下反转字符串。

答案 2 :(得分:0)

如您所知,有一个方法String#reverse来反转字符串。我知道你不是要使用那种方法,而是编写自己的方法,其中方法的参数是要反转的字符串。其他人会建议你这样做的方法。

由于您不熟悉Ruby,我认为向您展示如何为String类编写新方法(例如String#my_reverse,其行为与{完全相同)可能会很有帮助{1}}。然后对于字符串String#reverse,我们将:

"three blind mice"

要创建一个没有String类参数的方法,我们通常这样做:

"three blind mice".reverse    #=> "ecim dnilb eerht"
"three blind mice".my_reverse #=> "ecim dnilb eerht"

我们通过发送来调用class String def my_method ... end end 作为my_method类实例的接收者。例如,如果写:

String

我们将方法"three blind mice".my_method 发送给接收方String#my_method。在该方法的定义内,接收器被称为"three blind mice"。此处self将为self。同样,正如该字符串的第二个字符(偏移1)是"three blind mice""three blind mice"[1] #=> "h"。我们可以查看:

self[1] #=> "h"

会打印:

class String
  def my_method
    puts "I is '#{self}'"
    (0...self.size).each { |i| puts self[i] }
  end
end

"three blind mice".my_method

方法I is 'three blind mice' t h r e e b ... c e 几乎相同:

my_reverse

您可以将class String def my_reverse sz = self.size str = '' (0...sz).each { |i| str << self[sz-1-i] } str end end "three blind mice".my_reverse #=> "ecim dnilb eerht" 视为其值为接收器的变量,但与变量不同,您无法将self重新分配给其他对象。例如,我们可以编写self,但我们无法编写x = 1; x = 'cat'。但是,正如我们已经看到的,我们可以将自我引用更改为其他对象,例如self = 'cat'