检查构造函数中的变量

时间:2013-05-13 01:36:16

标签: ruby variables constructor

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

我将如何使用此示例在Ruby中执行此操作?

class Person
  attr_reader :name

  def initialize name 
    @name = name
  end
end

5 个答案:

答案 0 :(得分:1)

如果没有设置默认名称,并且在发送空字符串(而不是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:在`initialize'中:名称不能是空字符串(RuntimeError)

 from temp.rb:11:in `new'
 from temp.rb:11:in `<main>'
     

shell返回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

答案 1 :(得分:0)

我确信那些投出一些有趣且更好的答案的人,但这里是我的。

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的名称为No name


但是,如果你这样做

person = Person.new("Bob")

然后person将具有名称Bob


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

name = nil

然后将name传递给new方法

Person.new(name)

然后person的名称为No name

答案 2 :(得分:0)

这完全取决于 empty 的含义。如果您的意思是在没有设置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)等等。

答案 3 :(得分:0)

基于其他答案的作用,IMO的最佳方式是:

def initialize(name = 'Default name')
  @name = name
end

发表评论后......

这是Rails吗?这会改变一些事情。但你可以只检查值:

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

如果你正在使用Rails,你也可以使用blank?来检查nil?empty?

答案 4 :(得分:0)

为什么不在构造函数/ initialize方法中接受用户名?

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