为什么这个ruby使用\ u001表示1以及如何更改?

我写过经典的fizzbuzz代码。

规格:

describe "can determine fizzbuxx output for" do it "3" do expect(Fizzbuzz.nums(3)).to eq "123fizz" end end 

代码:

 class Fizzbuzz def self.nums(n) result="" (1..n).each do |inner| puts "inner #{inner}" result << inner if (inner % 3)==0 result << 'fizz' end if (inner % 5)==0 result << 'buzz' end end result end end 

为什么我得到\u001 …而不是1

 Failures: 1) can determine fizzbuxx output for 3 Failure/Error: expect(Fizzbuzz.nums(3)).to eq "123fizz" expected: "123fizz" got: "\u0001\u0002\u0003fizz" (compared using ==) # ./fizzbuzz_spec.rb:5:in `block (2 levels) in ' 

这是某种utf-8问题吗?

在Ruby中用于字符串concatenation: << ,如果对象是Integer,则将其视为代码点,并在连接之前转换为字符。 而且由于Ruby 1.9的默认编码是UTF-8。 代码点被强制用UTF-8编码:

 1.chr(Encoding::UTF_8) # => "\u0001" 

所以,当你这样做时:

 "" << 1 

Ruby实际上将1视为代码点并尝试将其转换为使用UTF-8编码的字符串,并且实际上将执行此操作:

 "" << 1.chr(Encoding::UTF_8) #=> "\u0001" 

所以,要解决你的问题。 您可以通过将代码更改为以下内容将Fixnum显式转换为String:

 result << inner.to_s 

或者使用字符串插值:

 result << "#{inner}" 

这是String#<<方法的预期行为。 从Ruby文档 :

将给定对象连接到str。 如果对象是Integer,则将其视为代码点,并在连接之前转换为字符。

您必须在追加之前将整数显式转换为字符串:

 '' << 1 # => "\u0001" '' << 1.to_s => "1" 

对于小数字,它们的类型是FixNum [保持整数值,可以用本机机器字(减1位)表示。 ]

 result << inner 

将其显式转换为String,您将获得所需的结果。

 result << inner.to_s 
Interesting Posts