我正在学习ruby并且知道在其他语言中我可以确保在初始化时变量不为空。
我将如何使用此示例在Ruby中执行此操作?
class Person
attr_reader :name
def initialize name
@name = name
end
end
答案 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