LetterCapitalize CoderByte错误Ruby

时间:2015-03-17 09:38:56

标签: ruby

我解决了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方法"?

3 个答案:

答案 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