我解决了CoderByte上的Letter Capitalize CoderByte,但控制台无法理解我的代码。它可能与他们过时的1.8.7 Ruby引擎有关。我收到这个错误:
(eval):1: undefined method `upcase' for 65:Fixnum (NoMethodError)
from (eval):1:in `map'
from (eval):1:in `LetterCapitalize'
from (eval):6
我在我的计算机上的最新版本的Ruby on Repl.it和v2.0.0上测试了我的代码,两个地方都运行良好。
这是我的初始代码:
def LetterCapitalize(str)
str.split.map{|i| i[0].upcase+i[1..i.length]}.join(" ")
end
最初,我怀疑上面的答案是否正确或有效。为了理解错误,是什么原因导致Coderbyte上的1.8.7 Ruby引擎无法理解" upcase方法"?
答案 0 :(得分:3)
区别在于1.8.7 version of String#[]
:
如果传递了一个Fixnum,则返回该位置的字符代码。
在later versions中,这将返回单个字符串,这正是您在代码中所期望的。
你需要在这里获得一个字符串。一种方法是使用chr
method将Fixnum转换为字符串:
str.split.map{|i| i[0].chr.upcase+i[1..i.length]}.join(" ")
由于String
响应chr
,因此这应该适用于Ruby的更高版本。
另一个解决方案是使用[]
的两个参数版本,它返回一个字符串:
str.split.map{|i| i[0,1].upcase+i[1..i.length]}.join(" ")
答案 1 :(得分:2)
为什么不尝试这种简单方法:使用capitalize方法
def LetterCapitalize(str)
str = str.split.map{|i| i.capitalize}.join(" ")
return str
end
我认为您的代码在某些情况下不正确,如Coderbyte问
对于Eg:
str = "heLlo woRld"
> str.split.map{|i| i[0].upcase+i[1..i.length]}.join(" ")
=> "HeLlo WoRld" #Only first character should be capital
现在检查此代码是否有相同的输入:
> str.split.map{|i| i.capitalize }.join(" ")
=> "Hello World"
答案 2 :(得分:1)
好像是1.8.7。不提供fixnum的大写,你可以编辑你的代码
def LetterCapitalize(str)
str.split.map{|i| i[0].to_s.upcase+i[1..i.length]}.join(" ")
end