我在exercism上尝试了一些练习。每个练习都附带一组我们需要通过的预先编写的测试。我目前正在努力的问题要求我们编写一个Robot类。每个机器人都应该有一个名为name的方法来设置默认名称。我是这样做的:
class Robot
attr_accessor :name
def self.name
@name = DateTime.now.strftime("%y%^b%k%M%S")
@name
end
end
问题是第一次测试(我现在跳过其余的测试)一直没能失败。这是测试:
def test_has_name
# rubocop:disable Lint/AmbiguousRegexpLiteral
assert_match /^[A-Z]{2}\d{3}$/, Robot.new.name
# rubocop:enable Lint/AmbiguousRegexpLiteral
end
我没有使用rubocop gem,所以我按原样留下了注释行。测试失败并出现此错误:
1) Failure:
RobotTest#test_has_name [robot-name/robot_name_test.rb:7]:
Expected /^[A-Z]{2}\d{3}$/ to match nil.
我认为最大的问题是我不能真正理解错误,而且我不知道是否需要安装rubocop并取消注释上面的行或我的代码是完全错误的。对此有任何帮助将非常感激。
答案 0 :(得分:1)
您的代码存在许多问题。
首先,您定义了访问者:name
,但您没有initialize
方法。
您定义的是一种类方法name
,如果您拨打Robot.name
,该方法就可以使用。
为了使您的课程有效,它应该如下所示:
class Robot
def initialize
@name = DateTime.now.strftime("%y%^b%k%M%S")
end
end
Robot.new.name
#=> "15MAY150035"
或者你会做
class Robot
def name
DateTime.now.strftime("%y%^b%k%M%S")
end
end
Robot.new.name
#=> "15MAY150649"
另外,在Ruby中,方法的最后一行已经是return
编辑的,所以你不必在这里写@name
:
def self.name
@name = DateTime.now.strftime("%y%^b%k%M%S")
@name # useless
end
此外,变量@name
在这里没用,因为方法name
无论哪种方式都会返回DateTime
个对象。
你必须确保你理解Ruby中的内容。
答案 1 :(得分:1)
您的代码将name
定义为Robot
类上的方法(这是self
指示的内容;此处@name
将是在类对象上设置成员变量)。您需要为每个实例提供一种名称。
作为次要问题,每次调用name
时,您的方法都会更改名称。您可能想要设置一次(当机器人可能是initialize
d时!),然后每次都返回。
答案 2 :(得分:1)
您的方法是一种类方法。这意味着Robot.name
会为您提供名称,而Robot.new.name
为nil
。
您想使用:
def name
#code
end
而不是self.name
。
您还可以在initialize
方法中设置名称:
def initialize
@name = 'RB123'
end