我已经用ruby练习了一些算法,我想知道是否有可能从方法中捕获返回的值。
下面的代码是在没有任何类型的反向方法且几乎没有局部变量的情况下反转字符串...
def rev(a)
i = -1
a.split("").each do |el|
el[0] = a[i]
i = i + (-1)
end.join
end
请注意,“ each”方法的结果未分配给任何变量。因此,“每个”计算结果为具有反向字符序列的数组。在“末端”(从字面上看),我只是“调用”了“连接”方法,将所有内容粘合在一起。想法是从所有这些过程中“捕获”返回的值,并检查对的字符串是否是回文,是真还是假。
如果反向字符串等于原始字符串,则该单词为回文。例如“ abba”,“ sexs”,“ radar” ...
例如:
def rev(a)
i = -1
a.split("").each do |el|
el[0] = a[i]
i = i + (-1)
end.join
# catch here the returned value from the code above
# and check if its a palindrome or not. (true or false)
end
谢谢你们!如果有人可以帮助我解决这个问题,我将不胜感激!
答案 0 :(得分:3)
只需添加== a
来查看您的冲销是否与原始字符串匹配:
def rev(a)
i = -1
a.split("").each do |el|
el[0] = a[i]
i = i + (-1)
end.join == a
end
puts rev("racecar")
puts rev("racecars")
true
false
这里是repl。
答案 1 :(得分:1)
如果要返回所有信息,则可以返回同时包含两个值的数组:
def rev(a)
i = -1
rev = a.split("").each do |el|
el[0] = a[i]
i = i + (-1)
end.join
[rev, rev == a] # or
# return rev, rev == a
end
p rev("abra") #=> ["arba", false]
p rev("abba") #=> ["abba", true]
您还可以返回哈希:
{ reverse: rev, palindrome: rev == a}
获得
#=> {:reverse=>"arba", :palindrome=>false}
#=> {:reverse=>"abba", :palindrome=>true}
答案 2 :(得分:1)
以下是您可以反转字符串的其他几种方法。
#1
def esrever(str)
s = str.dup
(str.size/2).times { |i| s[i], s[-1-i] = s[-1-i], s[i] }
s
end
esrever("abcdefg")
#=> "gfedcba"
esrever("racecar")
#=> "racecar"
这使用并行分配(有时称为多次分配)。
#2
def esrever(str)
a = str.chars
''.tap { |s| str.size.times { s << a.pop } }
end
esrever("abcdefg")
#=> "gfedcba"
esrever("racecar")
#=> "racecar"
我使用Object#tap只是为了避免创建一个初始化为空字符串的局部变量,然后将该变量设为方法的最后一行。
使用这两种方法,当且仅当str
时,字符串str == esrever(str)
是回文。