我正在学习 ruby 并且知道在其他语言中我可以确保初始化时变量不为空。
我将如何使用这个示例在 Ruby 中执行此操作?
class Person
attr_reader :name
def initialize name
@name = name
end
end
我正在学习 ruby 并且知道在其他语言中我可以确保初始化时变量不为空。
我将如何使用这个示例在 Ruby 中执行此操作?
class Person
attr_reader :name
def initialize name
@name = name
end
end
如果不设置默认名称,并且如果发送空字符串(不是 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
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?
.
这完全取决于您的意思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
)等等。
为什么不从构造函数/初始化方法中接受用户名?
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
我敢肯定,人们会提出一些有趣且更好的答案,但这是我的。
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
。