Ruby 检查构造函数中的变量

Ruby 检查构造函数中的变量,ruby,variables,constructor,Ruby,Variables,Constructor,我正在学习ruby,并且知道在其他语言中,我可以确保初始化时变量不是空的 在这个示例中,我将如何在Ruby中实现这一点 class Person attr_reader :name def initialize name @name = name end end 我相信人们会给出一些有趣且更好的答案,但这是我的 class Person attr_reader :name # By setting name = nil, we are letting init

我正在学习ruby,并且知道在其他语言中,我可以确保初始化时变量不是空的

在这个示例中,我将如何在Ruby中实现这一点

class Person
  attr_reader :name

  def initialize name 
    @name = name
  end
end

我相信人们会给出一些有趣且更好的答案,但这是我的

class Person
  attr_reader :name

  # By setting name = nil, we are letting initialize 
  # know that the parameter name may or may not be given.
  def initialize(name = nil) 
    if name
      @name = name
    else
      # This is what you do when the user 
      # did not add a name in the initializer.
      @name = "No name"
    end
  end
end

所以如果你做类似的事情

person = Person.new
人员
将具有姓名
无姓名


然而,如果你这样做

person = Person.new("Bob")
然后,
person
将具有名称
Bob


最后,如果将变量设置为nil,例如

name = nil
然后将
name
传递到
new
方法中

Person.new(name)

然后,
会有名字
没有名字

我相信有人会给出一些有趣且更好的答案,但这是我的

class Person
  attr_reader :name

  # By setting name = nil, we are letting initialize 
  # know that the parameter name may or may not be given.
  def initialize(name = nil) 
    if name
      @name = name
    else
      # This is what you do when the user 
      # did not add a name in the initializer.
      @name = "No name"
    end
  end
end

所以如果你做类似的事情

person = Person.new
人员
将具有姓名
无姓名


然而,如果你这样做

person = Person.new("Bob")
然后,
person
将具有名称
Bob


最后,如果将变量设置为nil,例如

name = nil
然后将
name
传递到
new
方法中

Person.new(name)

然后
会有名字
没有名字

这取决于你所说的空。如果您的意思是调用
Person.new
,而不使用
name
变量集,如:

a = Person.new
然后,您应该为其定义一个默认值:

def initialize( name = 'Jeffrey' )
    @name = name
end
如果您指的是
nil
值,则可以执行以下操作:

def initialize name 
    @name = (name.nil?) ? 'Jeffrey' : name
end

然后从这里我想你知道如何使用空字符串(
@name=(name=”)“Jeffrey”:name
)等等。

这一切都取决于你所说的空。如果您的意思是调用
Person.new
,而不使用
name
变量集,如:

a = Person.new
然后,您应该为其定义一个默认值:

def initialize( name = 'Jeffrey' )
    @name = name
end
如果您指的是
nil
值,则可以执行以下操作:

def initialize name 
    @name = (name.nil?) ? 'Jeffrey' : name
end

然后从这里我想你知道如何使用空字符串(
@name=(name=”)“Jeffrey”:name
)等等。

根据其他答案,IMO的最佳方法是:

def initialize(name = 'Default name')
  @name = name
end
在你的评论之后

这是铁轨吗?这将改变一些事情。但您可以只检查零值:

def initialize(name)
  if name.nil? || name.empty?
    # raise an exception
  else
    @name = name
  end
end

如果您使用的是Rails,也可以只使用
blank?
,它将同时选中
nil?
empty?

根据其他答案,IMO的最佳方法是:

def initialize(name = 'Default name')
  @name = name
end
在你的评论之后

这是铁轨吗?这将改变一些事情。但您可以只检查零值:

def initialize(name)
  if name.nil? || name.empty?
    # raise an exception
  else
    @name = name
  end
end

如果您使用的是Rails,您也可以只使用
blank?
,它将选中
nil?
empty?
,,而不设置默认名称,如果发送空字符串(而不是nil)作为参数,则会引发异常

class Person
  attr_reader :name

  def initialize name 
    raise "Name can not be an empty String" if name.empty?
    @name = name
  end
end
然后,如果要发送空字符串,则会出现类似以下错误:

temp.rb:5:in `initialize': Name can not be an empty String (RuntimeError)
    
      from temp.rb:11:in `new'
      from temp.rb:11:in `<main>'

shell returned 1
temp.rb:5:in'initialize':名称不能为空字符串(RuntimeError)
从临时rb:11:in‘new’
从温度rb:11:in`'
壳返回1
至于你在另一条评论中提到的“让他们输入另一个名字直到有效”部分。。。您应该让正在运行的代码执行此操作

这不允许使用默认值,但强制用户使用空字符串以外的内容

class PersonNameError < Exception
end
class Person
  attr_reader :name

  def initialize name
    @name = name
  end
end

begin
  print "What is your name? "
  name = gets.chomp
  raise PersonNameError if name.empty?
  person = Person.new(name)
rescue PersonNameError
  if name.empty?
    puts "You can not have a name that is ''"
    retry
  else
    raise
  end
end

puts person.name
class PersonNameError
在不设置默认名称的情况下,如果发送空字符串(而不是nil)作为参数,则可以引发异常

class Person
  attr_reader :name

  def initialize name 
    raise "Name can not be an empty String" if name.empty?
    @name = name
  end
end
然后,如果要发送空字符串,则会出现类似以下错误:

temp.rb:5:in `initialize': Name can not be an empty String (RuntimeError)
    
      from temp.rb:11:in `new'
      from temp.rb:11:in `<main>'

shell returned 1
temp.rb:5:in'initialize':名称不能为空字符串(RuntimeError)
从临时rb:11:in‘new’
从温度rb:11:in`'
壳返回1
至于你在另一条评论中提到的“让他们输入另一个名字直到有效”部分。。。您应该让正在运行的代码执行此操作

这不允许使用默认值,但强制用户使用空字符串以外的内容

class PersonNameError < Exception
end
class Person
  attr_reader :name

  def initialize name
    @name = name
  end
end

begin
  print "What is your name? "
  name = gets.chomp
  raise PersonNameError if name.empty?
  person = Person.new(name)
rescue PersonNameError
  if name.empty?
    puts "You can not have a name that is ''"
    retry
  else
    raise
  end
end

puts person.name
class PersonNameError
为什么不接受构造函数/初始化方法中的用户名

def initialize name

begin
  while name.empty?
    puts "You can not have a name that is ''"
     print "What is your name? "
     name = gets.chomp
  end
  @name = name
end
end

为什么不接受构造函数/初始化方法中的用户名

def initialize name

begin
  while name.empty?
    puts "You can not have a name that is ''"
     print "What is your name? "
     name = gets.chomp
  end
  @name = name
end
end

您的意思是要提供默认值吗?如果传递了
nil
,则引发异常。。。你能说得更具体一点吗?@LoganSerman我不想要默认值,我知道怎么做。我想知道你是否传入“”而不是“Paul”如何捕获该异常,并让用户重新输入该值,直到他们输入有效的内容。如果参数无效,请输入错误。@DaveNewton我对Ruby还是很陌生,是否有办法引发错误,让用户更正错误,而不使程序崩溃?您的意思是要提供默认值吗?如果传递了
nil
,则引发异常。。。你能说得更具体一点吗?@LoganSerman我不想要默认值,我知道怎么做。我想知道你是否传入“”而不是“Paul”,如何捕获该异常,并让用户重新输入该值,直到他们输入有效的值。如果参数无效,请输入错误。@DaveNewton我对Ruby还是很陌生,有没有办法