2016-06-01 90 views
0
class Player 
    def initialize (name, age, start_year) 
    @name  = name.capitalize 
    @age  = age 
    @start_year = start_year 
    end 

    def playing_for 
    current_year = Time.new.strftime("%Y") 
    num_of_years = current_year - @start_year 
    @num_of_years = num_of_years 
    end 

    def to_s 
    "Hi, my name is #{@name}. I am #{@age} years old. I have been playing Ultimate for #{@num_of_years} years." 
    end 
end 

jon = Player.new("jon", 41, 2009) 
puts jon 

实例变量当运行在终端上面的代码,它显示为:Ruby初学者。未示出

Hi my name is Jon. I am 41 years old. I have been playing Ultimate for years. 

和不显示#{@num_of_years}

很明显,我定义@num_of_years的方式有问题,但我无法弄清楚什么。不打印

+2

你在哪里调用'playing_for'来为'@ num_of_years'设置值? –

+0

还有一个错误:Time.new.strftime(“%Y”)'返回一个字符串,所以'current_year - @ start_year'变成'“2016” - 2009',这不起作用(你不能减去一个数字来自一个字符串)。改用'Time.new.year'。 – Stefan

+0

@Stefan谢谢! – iswg

回答

3

@num_of_years IST,因为变量未设置(未初始化的实例变量具有一个空字符串一个的nil"#{nil}"结果值)。而另一方面在playing_for被设定,它永远不会被调用

jon = Player.new("jon", 41, 2009) # <- "new" calls Player#initialize 
puts jon       # <- "puts" calls Player#to_s 

@num_of_years(这一点:

@name@age@start_yearinitialize这是通过调用Player.new调用都设置,并to_sputs调用是什么魔杖制造商wanted to say)。

你可以调用puts之前手动调用方法:(记得用year更换strftime("%Y")修复the bug

jon = Player.new("jon", 41, 2009) 
#=> #<Player:0x007fab8a8aa448 @name="Jon", @age=41, @start_year=2009> 
jon.to_s 
#=> "Hi, my name is Jon. I am 41 years old. I have been playing Ultimate for years." 
jon.playing_for 
#=> 7 
jon.to_s 
#=> "Hi, my name is Jon. I am 41 years old. I have been playing Ultimate for 7 years." 

puts jon 

打印:

Hi, my name is Jon. I am 41 years old. I have been playing Ultimate for 7 years. 

但记得要打电话每次变方法很快很乏味。

它更容易设置@num_of_years在初始化,就像其他的实例变量:

class Player 
    def initialize (name, age, start_year) 
    @name   = name.capitalize 
    @age   = age 
    @start_year = start_year 
    @num_of_years = Time.new.year - start_year 
    end 

    def to_s 
    "Hi, my name is #{@name}. I am #{@age} years old. I have been playing Ultimate for #{@num_of_years} years." 
    end 
end 

puts Player.new("jon", 41, 2009) 
#=> Hi, my name is Jon. I am 41 years old. I have been playing Ultimate for 7 years. 

或者你可以定义计算差值的方法。但你并不需要另一个实例变量在这种情况下,只返回值:

class Player 
    def initialize (name, age, start_year) 
    @name   = name.capitalize 
    @age   = age 
    @start_year = start_year 
    end 

    def playing_for 
    Time.new.year - @start_year 
    end 

    def to_s 
    "Hi, my name is #{@name}. I am #{@age} years old. I have been playing Ultimate for #{playing_for} years." 
    end 
end 

puts Player.new("jon", 41, 2009) 
#=> Hi, my name is Jon. I am 41 years old. I have been playing Ultimate for 7 years. 

看看在to_s方法。我已将#{@num_of_years}替换为#{playing_for}

+0

非常感谢你斯特凡!你是我的英雄先生 – iswg