Ruby 检查是否已分配属性的测试失败

Ruby 检查是否已分配属性的测试失败,ruby,regex,Ruby,Regex,我正在做一些练习。每个练习都附带一套我们需要通过的预先编写的测试。我目前正在处理的问题要求我们编写一个机器人类。每个机器人都应该有一个名为name的方法来设置默认名称。我是这样做的: class Robot attr_accessor :name def self.name @name = DateTime.now.strftime("%y%^b%k%M%S") @name end end class Robot def initialize @na

我正在做一些练习。每个练习都附带一套我们需要通过的预先编写的测试。我目前正在处理的问题要求我们编写一个机器人类。每个机器人都应该有一个名为name的方法来设置默认名称。我是这样做的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end
class Robot

  def initialize
    @name = DateTime.now.strftime("%y%^b%k%M%S")
  end

end

Robot.new.name
#=> "15MAY150035"
问题是第一次测试(我现在跳过其余的测试)总是失败。以下是测试:

  def test_has_name
    # rubocop:disable Lint/AmbiguousRegexpLiteral
    assert_match /^[A-Z]{2}\d{3}$/, Robot.new.name
    # rubocop:enable Lint/AmbiguousRegexpLiteral
  end
我没有使用rubocopgem,所以我保留了注释行。测试失败,出现以下错误:

  1) Failure:
RobotTest#test_has_name [robot-name/robot_name_test.rb:7]:
Expected /^[A-Z]{2}\d{3}$/ to match nil.

我想最大的问题是我并不真正理解这个错误,我不知道我是否需要安装rubocop,并且取消注释上面或我的代码中的那些行是完全错误的。在此方面的任何帮助都将不胜感激

您的代码存在许多问题

首先,定义访问器
:name
,但没有
初始化方法

您所定义的是一个类方法
name
,如果您调用
Robot.name
,它将起作用

为了让你的课堂发挥作用,它应该是这样的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end
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中,方法中的最后一行已经是
返回的内容,所以您不必在此处写入
@name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name # useless
  end
此外,变量
@name
在这里是无用的,因为方法
name
无论哪种方式都将返回
DateTime
对象


您必须确保理解Ruby中的内容。

您的代码存在许多问题

首先,定义访问器
:name
,但没有
初始化方法

您所定义的是一个类方法
name
,如果您调用
Robot.name
,它将起作用

为了让你的课堂发挥作用,它应该是这样的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end
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中,方法中的最后一行已经是
返回的内容,所以您不必在此处写入
@name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name # useless
  end
此外,变量
@name
在这里是无用的,因为方法
name
无论哪种方式都将返回
DateTime
对象


您必须确保理解Ruby中的内容。

您的代码存在许多问题

首先,定义访问器
:name
,但没有
初始化方法

您所定义的是一个类方法
name
,如果您调用
Robot.name
,它将起作用

为了让你的课堂发挥作用,它应该是这样的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end
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中,方法中的最后一行已经是
返回的内容,所以您不必在此处写入
@name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name # useless
  end
此外,变量
@name
在这里是无用的,因为方法
name
无论哪种方式都将返回
DateTime
对象


您必须确保理解Ruby中的内容。

您的代码存在许多问题

首先,定义访问器
:name
,但没有
初始化方法

您所定义的是一个类方法
name
,如果您调用
Robot.name
,它将起作用

为了让你的课堂发挥作用,它应该是这样的:

class Robot
  attr_accessor :name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name
  end
end
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中,方法中的最后一行已经是
返回的内容,所以您不必在此处写入
@name

  def self.name
    @name = DateTime.now.strftime("%y%^b%k%M%S")
    @name # useless
  end
此外,变量
@name
在这里是无用的,因为方法
name
无论哪种方式都将返回
DateTime
对象


您必须确保理解Ruby中的内容。

您的代码将
名称定义为
Robot
类上的方法(这就是
self
所指示的;这里将在类对象上设置成员变量)。您需要为每个实例提供一个名称


其次,每次调用
name
时,方法都会更改名称。您可能希望设置它一次(当robot是
初始化
d时,可能!),然后每次都返回该值。

您的代码将
名称
定义为
robot
类上的一个方法(这是
self
指示的;并且
@name
这里将在类对象上设置一个成员变量)。您需要为每个实例提供一个名称


其次,每次调用
name
时,方法都会更改名称。您可能希望设置它一次(当robot是
初始化
d时,可能!),然后每次都返回该值。

您的代码将
名称
定义为
robot
类上的一个方法(这是
self
指示的;并且
@name
这里将在类对象上设置一个成员变量)。您需要为每个实例提供一个名称


其次,每次调用
name
时,方法都会更改名称。您可能希望设置它一次(当robot是
初始化
d时,可能!),然后每次都返回该值。

您的代码将
名称
定义为
robot
类上的一个方法(这是
self
指示的;并且
@name
这里将在类对象上设置一个成员变量)。您需要为每个实例提供一个名称


其次,每次调用
name
时,方法都会更改名称。您可能希望设置它一次(当robot是
初始化
d时,可能!),然后每次都返回该值。

您的方法是类方法。这意味着
Robot.name
将为您提供名称,而
Robot.new.name
nil

您要使用:

def name
  #code
end
而不是
self.name

您还可以在
初始化
方法中设置名称:

def initialize 
  @name = 'RB123'
end

您的方法是类方法。这意味着
机器人。