1

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

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

class Person
  attr_reader :name

  def initialize name 
    @name = name
  end
end
4

5 回答 5

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: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

至于您在另一条评论中提到的“它使他们输入另一个名称直到有效”的部分......您应该让正在运行的代码执行此操作。

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

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
于 2013-05-13T02:38:53.317 回答
0

Based on what the other answers are doing, the best way IMO is:

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

After your comment...

Is this Rails? That would change a few things. But you can just nil check the value:

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

If you're using Rails, you can also just use blank? which will check both nil? and empty?.

于 2013-05-13T01:55:28.257 回答
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)等等。

于 2013-05-13T01:47:58.750 回答
0

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

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
于 2013-05-13T07:27:42.130 回答
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

于 2013-05-13T01:47:11.203 回答