@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_year
在initialize
这是通过调用Player.new
调用都设置,并to_s
由puts
调用是什么魔杖制造商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}
。
你在哪里调用'playing_for'来为'@ num_of_years'设置值? –
还有一个错误:Time.new.strftime(“%Y”)'返回一个字符串,所以'current_year - @ start_year'变成'“2016” - 2009',这不起作用(你不能减去一个数字来自一个字符串)。改用'Time.new.year'。 – Stefan
@Stefan谢谢! – iswg