-2

在下面的程序(用 irb shell 编写)中,我调用了一个hidden类的方法,该方法Tester接受两个参数,它们都是字符串,然后在修改它们后返回一个字符串。我得到了一个我没想到的输出。

我期望的是:

def hidden(aStr,anotherStr) # After the call aStr = suhail and anotherStr = gupta
  anotherStr = aStr + " " + anotherStr
  # After the above statement anotherStr = suhail gupta
  return aStr + anotherStr.reverse 
  # After the above statement value returned should be suhailliahusatpug
  # i.e suhail + "reversed string of suhailgupta"
  end

  # But i get suhailatpug liahus

实际代码:

1.9.3p194 :001 > class Tester
1.9.3p194 :002?>   def hidden(aStr,anotherStr)
1.9.3p194 :003?>     anotherStr = aStr + " " + anotherStr
1.9.3p194 :004?>     return aStr + anotherStr.reverse
1.9.3p194 :005?>     end
1.9.3p194 :006?>   end
1.9.3p194 :007 > o = Tester.new
=> #<Tester:0x9458b80> 
1.9.3p194 :008 > str1 = "suhail"
=> "suhail" 
1.9.3p194 :009 > str2 = "gupta"
=> "gupta" 
1.9.3p194 :010 > str3 = o.hidden(str1,str2)
=> "suhailatpug liahus" 

这是为什么 ?与其他一些 OOP 语言(如Java )相比,Ruby中的问题是否不同

4

1 回答 1

0

问题

你没有你认为你有的字符串。忘记方法,逐行执行:

# You passed these as parameters, so they're assigned.
aStr = 'suhail'
anotherStr = 'gupta'

# You re-assign a new string, including a space.
anotherStr = aStr + " " + anotherStr
=> "suhail gupta"

# You are concatenating two different strings.
aStr + anotherStr
=> "suhailsuhail gupta"

# You concatenate two strings, but are reversing only the second string.
aStr + anotherStr.reverse
=> "suhailatpug liahus"

这一切都是应有的。

解决方案

如果您想要“suhailatpugliahus”,那么您需要避免将新值重新分配给anotherStr

def hidden(aStr,anotherStr)
    aStr + (aStr + anotherStr).reverse
end  
hidden 'suhail', 'gupta'
=> "suhailatpugliahus"
于 2012-06-15T06:35:28.520 回答