2013-12-24 79 views
0

有人可以帮助newb吗?我遇到了错误;没有方法错误,来自不同类的调用方法,传递参数

: undefined method `computer_name' for nil:NilClass (NoMethodError) 

我想在ruby中调用带.method_name的方法吗?
是因为我的初始化方法不正确?没有正确传递参数?

load 'admin_logic.rb' 
load 'computer_logic.rb' 
load 'user_logic.rb' 

class TicTacToe 
    def initialize(admin_object, computer_object, user_object) 
    admin_object = Admin.new 
    computer_object = ComputerLogic.new 
    user_object = UserLogic.new 
    @new_game = TicTacToe.new(admin_object, computer_object, user_object) 
    end 
end 

puts "Hello, I\'m " + @new_game.computer_name + ", let\'s play Tic Tac Toe! What is your name?" 

puts "Great " + @new_game.user_name + ", you\'ll be " + @new_game.user_sign + ". Please choose where you want to go." 

puts 'The game board is the following, please remember!' 
puts ' a1 | a2 | a3' 
puts " --- --- ---" 
puts ' b1 | b2 | b3' 
puts " --- --- ---" 
puts ' c1 | c2 | c3' 

@new_game.user_sign 
@new_game.computer_sign 
@new_game.game_board 
@new_game.winning_propositions 

while @new_game .computer_win != true do 
    @new_game.user_turn 
    @new_game.draw_game_outcome 
    @new_game.player_first_turn_check? 
    @new_game.draw_game_outcome 
end 

我的课,我称之为FROM - ADMIN.RB

class Admin 
    def computer_name 
    @computer_name = "Watson" 
    end 
end 
+0

我不会看到'需要'管理员行。 – vgoff

+0

或者'需要'ADMIN'',因为它在呼叫上限。 – vgoff

+0

但是,在完成之后,您需要在其存在的类的实例上调用该方法。 – vgoff

回答

2

您正在设置@new_game类里面。您正在尝试使用您的班级的OUIDIDE。变量作用域不允许你这样做。

你想要做的就像下面这样。

class TicTacToe 
    def initialize(admin_object, computer_object, user_object) 
    admin_object = Admin.new 
    computer_object = ComputerLogic.new 
    user_object = UserLogic.new 
    end 
end 

@new_game = TicTacToe.new(admin_object, computer_object, user_object) 

这将创建TicTacToe类,您就可以使用您定义的方法的一个实例。

+0

我确实尝试了这个,并得到一个错误; :未定义的局部变量或方法'admin_object'为主:对象(NameError) 〜/编码/ TicTacToe: – user2817130

+0

我认为你需要阅读面向对象编程,Ruby中的变量作用域,并可能谷歌你的错误。 –

0

这不是对象的工作方式。您的初始化程序正在调用自己以开始。

这可能是一个更好的起点,但请花一些时间做一些基本的阅读有关OOP:

class Admin 
    def name 
    "Watson" 
    end 
    alias_method :to_s, :name 
end 

class TicTacToe 
    attr_reader :admin_object, :computer_object, :user_object 

    def initialize 
    @admin_object = Admin.new 
    @computer_object = ComputerLogic.new 
    @user_object = UserLogic.new 
    end 
end 

@new_game = TicTacToe.new 

退房一些教程,例如。 https://www.ruby-lang.org/en/documentation/quickstart/2/

+0

你知道为什么我会在尝试这个时遇到这个错误吗? :未定义的局部变量或方法'admin_object'为主:对象(NameError)〜/编码/ TicTacToe: - – user2817130

+0

是的,我更新了答案,因为你实际上不需要将任何* _对象传递给初始值设定项。 – Bartosz