2012-03-13 32 views
26

Tôi đang thử nghiệm với mảng và đang đọc cuốn sách "Khởi đầu Ruby on Rails" của Steve Holzner. Tôi đã thực hiện chương trình:Loại mảngError: không thể chuyển đổi Fixnum thành String

array = ['Hello', 'there', 1, 2] 
puts array[1] 
puts array[3] 
puts array.length 
array2 = Array.new 
puts array2.length 
array2[0] = "Banana" 
array2[1] = 6 
puts array2[0] + " " + array2[1] 
puts array3.length 

Nó không làm được gì nhiều, nhưng khi tôi chạy nó tôi nhận được lỗi

arrays.rb:9:in `+': can't convert Fixnum into String (TypeError) 
    from arrays.rb:9 

Tại sao tôi nhận được lỗi này?

Trả lời

50

Bạn không thể thêm chuỗi và số nguyên (Fixnum), trong trường hợp này bạn đã cố gắng thêm 6 vào "Chuối".

Nếu trên dòng 9 bạn đã làm điều này:

puts array2[0] + " " + array2[1].to_s 

Bạn sẽ nhận được:

"Banana 6" 
+2

Đánh bại tôi bằng giây. :) –

+1

Tôi muốn thêm một lỗi ở đây là một tính năng của một ngôn ngữ được đánh máy mạnh, trong đó Ruby là một ví dụ. PHP, một ngôn ngữ được đánh máy yếu, sẽ cho phép sự lừa đảo đó. – bernie

+3

@bernie Đó là kết quả trực tiếp hơn của các quy tắc cưỡng chế kiểu Ruby, không phải là cách đánh máy mạnh mẽ. Ví dụ, Float + Fixnum trong Ruby là hợp pháp vì Ruby biết cách ép buộc một kiểu này sang kiểu khác. Bạn thực sự có thể mở lại Fixnum và thêm một phương thức 'coerce' để làm cho String + Fixnum trở thành hợp pháp. –

4

array2[1]6, mà là một Fixnum. Nó không biết làm thế nào để thêm tự nó lên một chuỗi (mà trong trường hợp này là Banana. Nếu bạn đã chuyển nó sang một chuỗi, nó sẽ chỉ làm việc tốt.

puts array2[0] + " " + array2[1].to_s 
3

Các lỗi được về cơ bản nói rằng bạn không thể chuyển đổi array2[1] (giá trị là một số, một loại Fixnum trong trường hợp này) thành loại Chuỗi. Cách bạn sẽ làm việc xung quanh việc này là chuyển loại thành số Chuỗi (đây là dòng 9, nơi lỗi xảy ra):

puts array2[0] + " " + array2[1].to_s 

Mảng2 [1]. to_s chuyển đổi số thành loại Chuỗi.

1

Đã không cố gắng này bản thân mình, nhưng hãy thử thay thế

puts array2[0] + " " + array2[1] 

với

puts array2[0] + " " + array2[1].to_s 
+0

array2 [0] đã là một kiểu String, bạn muốn chuyển đổi phần tử 1 (mảng2 [1]) vì nó giữ "6" –

+0

@Kevin Jalbert Vâng, tôi đã thấy nó. Cảm ơn! –

+0

Không có vấn đề gì, chỉ cần chỉ ra (vui vì bạn cũng bắt được nó). –

0

Dưới đây là một cách để chuyển đổi một biểu thức Fixnum vào một chuỗi,

x=2 
print (x+20).to_s + "\sbanannas" 

Bạn chưa Không biết bạn có thể tack trên FixnNum # to_s phương pháp để những parens.

Các vấn đề liên quan