我不明白为什么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("") == ""}")
答案 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'
。