2012-03-20 32 views
8

Tôi đang cố gắng tìm hiểu cách tạo chương trình nhiều lớp bằng ruby. Tôi đã mã hóa một lớp Engine và một số lớp khác như thành phố, đường phố, v.v. và có vấn đề trong việc chuyển tên lớp như là một biến cho các lớp khác. Mã bên dưới ném lỗi: "City.rb: 15: in 'intro': undefined local variable hoặc method method 'cho # (NameError)". Tôi hiểu vấn đề một cách, nhưng tôi không nghĩ rằng thành phố cần phải biết bất cứ điều gì về đối tượng trò chơi , tôi nghĩ rằng nó chỉ có để có được nó và vượt qua nó trở lại. Nhưng tôi cảm thấy có sự hiểu lầm về cách truyền các biến (đặc biệt là tên lớp) giữa các lớp. Có gì sai trong thiết kế của tôi?Làm cách nào để chuyển tên lớp dưới dạng biến sang lớp khác trong ruby ​​

#Game.rb 
require './City.rb' 
class Engine 
    def initialize(city_name, street_name, budget) 
    @city = City.new(city_name) 
    @city.read_name() 
    play(@city, :intro, self) 
    end 

    def play(place, next_step, engine) 
    while true 
     next_step = place.method(next_step).call(place, next_step, engine) 
    end 
    end 
end 

game = Engine.new("Casablanca", "Costanza Boulvard", 200) 

#City.rb 
class City 
    def initialize(city_name) 
    @city_name = city_name 
    end 

    def read_name() 
    puts <<-READ_NAME 
    You are in a city called "#{@city_name}". 
    READ_NAME 
    end 

    def intro(place, next_step, engine) 
    puts "...." 
    game.play(@street, :enter, engine) 
    end 
end 
+0

Tôi không biết bạn đang chuyển tên lớp ở đâu. –

+0

Ngoài ra, hãy sửa tên của bạn. Nên là 'city.rb' và' game.rb' (tên tập tin - snake_case, tên lớp - PascalCase). –

+0

Cảm ơn lời khuyên. Tôi đã cố gắng để vượt qua tên lớp như là động cơ trên game.rb # 6 như bản thân và trên game.rb # 9 như là động cơ biến. Đây có lẽ là nơi tôi bị nhầm lẫn. Bạn có thể cho tôi một ví dụ vững chắc về cách chuyển tên lớp cho một lớp khác, hoàn toàn ngoài ví dụ của tôi không? – barerd

Trả lời

15

Bạn có thể vượt qua trong một lớp học như một tham số như bình thường:

def use_class(myclass) 
    x = myclass.new "test" 
    x.read_name 
end 

use_class(City) 
# returned -> ' You are in a city called "test".' 

Tuy nhiên, lỗi của bạn không liên quan đến này. Về cơ bản, bạn đang cố gắng sử dụng đối tượng game trong phạm vi của một lớp nhưng chưa tồn tại ở đó.

Để vượt qua một tham chiếu đến dụ game đến thành phố lớp, bạn có thể làm điều gì đó như:

@city = City.new(city_name, self) 

và sửa đổi các nhà xây dựng thành phố để

def initialize(city_name, game) 
    @city_name = city_name 
    @game = game 
    end 

Sau đó, thành phố # giới thiệu sẽ có:

@game.play(@street, :enter, @game) 

Có thể có lỗi khác, vì @street không xác định ed trong thành phố được nêu ra, nhưng đó là một vấn đề khác.

+0

Khi tôi nhìn vào vấn đề theo cách này, nó có vẻ rất hợp lý và dễ dàng. Như tôi đã đề cập, tôi có một đường cong học tập rất dốc để chuyển các tham số, có thể là cho các phương thức hoặc các lớp. Tôi đã đọc và tiếp tục đọc hướng dẫn về điều này nhưng lại phạm sai lầm mỗi lần. Bạn có thể nhớ chỉ cho tôi một tài liệu hay về việc truyền các tham số hoặc định hướng đối tượng để tôi có thể tự tìm được, cách @street nên được định nghĩa trong Thành phố. – barerd

+0

\ @var_name là các biến lớp/thành viên/trường. Xem cách @city_name được intialized. Đây là [hướng dẫn] (http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/) về các lớp trong ruby. – Candide

+0

Tôi đã đọc hướng dẫn đó trước đây. Hãy để tôi đặt nó như thế này: làm thế nào tôi có thể tham khảo một đối tượng của lớp B bên trong một đối tượng của lớp A, trong khi không A hoặc B thừa kế từ mỗi khác? Khi một trong số họ kế thừa, tôi có thể làm được.Tôi vẫn đang làm việc với phần đầu tiên của mã của bạn (myclass), và đang viết bình luận này để nó không phải là một phản hồi quá muộn, xin lỗi. – barerd

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