如何从方法内部获取方法的返回值?

时间:2018-08-08 01:42:32

标签: ruby algorithm

我已经用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

谢谢你们!如果有人可以帮助我解决这个问题,我将不胜感激!

3 个答案:

答案 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)是回文。