Helpex - Trao đổi & giúp đỡ Đăng nhập
27

Tôi đang tạo một Wordlớp và gặp lỗi:

TypeError: siêu lớp không khớp cho lớp Word

Đây là mã irb :

irb(main):016:0> class Word
irb(main):017:1>  def palindrome?(string)
irb(main):018:2>   string == string.reverse
irb(main):019:2>  end
irb(main):020:1> end
=> nil
irb(main):021:0> w = Word.new
=> #<Word:0x4a8d970>
irb(main):022:0> w.palindrome?("foobar")
=> false
irb(main):023:0> w.palindrome?("level")
=> true
irb(main):024:0> class Word < String
irb(main):025:1>  def palindrome?
irb(main):026:2>    self == self.reverse
irb(main):027:2>  end
irb(main):028:1> end
TypeError: superclass mismatch for class Word
 from (irb):24
 from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start'
 from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start'
 from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top (required)>'
 from script/rails:6:in `require'
 from script/rails:6:in `<main>'
27 hữu ích 3 bình luận 32k xem chia sẻ
42

Quy tắc ngón tay cái cho irb (theo cách irbhoặc rails console)

Nếu bạn đang tạo cùng một lớp hai lần với sự kế thừa (lớp cha), hãy thoát thể hiện irb và tạo lại. Tại sao là cái này? Vì nếu không sẽ xảy ra xung đột giai cấp.

Trong trường hợp của bạn, bạn đang sử dụng Windows (tìm thấy từ câu hỏi), vì vậy chỉ cần gõ exitvào lời nhắc DOS và gõ lại irbhoặc rails consolevà tạo lớp Word của bạn và nó sẽ hoạt động. Vui lòng cho tôi biết nếu nó không hiệu quả với bạn.

42 hữu ích 1 bình luận chia sẻ
21

Lý do nó cung cấp cho bạn lỗi không khớp siêu lớp là vì bạn đã xác định Wordlớp đó là kế thừa từ Đối tượng

class Word
...
end

Trong Ruby (giống như trong hầu hết các ngôn ngữ động), bạn có thể các lớp bằng cách mở lại định nghĩa và sửa đổi lớp. Tuy nhiên, trong trường hợp của bạn, khi bạn đang mở lại lớp, bạn cũng đang cố gắng xác định lại lớp đó là kế thừa từ siêu lớp String.

class Word < String
...
end

Khi một lớp và cấu trúc kế thừa của nó đã được xác định, bạn không thể định nghĩa lại nó.

Như một số người đã nói, thoát và khởi động lại irb sẽ cho phép bạn bắt đầu lại từ đầu trong việc xác định Wordlớp.

21 hữu ích 1 bình luận chia sẻ
17

link664 đã giải thích rõ ràng vấn đề.

Tuy nhiên, có một cách khắc phục dễ dàng hơn mà không cần bỏ irb (và mất tất cả các công việc khác của bạn). Bạn có thể xóa định nghĩa lớp hiện có theo cách này.

irb(main):051:0> Object.send(:remove_const, :Word)

và bạn có thể xác minh bằng:

irb(main):052:0> Word.public_instance_methods

cái nào sẽ trả về:

NameError: uninitialized constant Word
from (irb):52
17 hữu ích 0 bình luận chia sẻ
0

Một cách dễ dàng để bỏ qua vấn đề này là đóng gói cả hai lớp giữa các mô-đun khác nhau:

> module M
>     class Word
>         def palindrome?(string)
>             string == string.reverse
>         end
>     end
> end
=> nil
> w = M::Word.new
=> #<Word:0x4a8d970>
> w.palindrome?("foobar")
=> false
> w.palindrome?("level")
=> true
> module N
>     class Word < String
>         def palindrome?
>             self == self.reverse
>         end
>     end
> end
> N::Word.new("kayak").palindrome?
=> true
0 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading