在构造函数中检查变量
我在学习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
将命名No name
。
但是,如果你这样做
person = Person.new("Bob")
然后person
将命名Bob
。
最后,如果你设置一个变量作为零,例如
name = nil
然后通过name
到new
方法
Person.new(name)
那么person
将命名No name
。
我不想设置默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如name =“”而不是像name =“Paul”这样的有效名称。如果一个空字符串被传入,它只是不断让用户重新输入有效信息,直到他们输入正确的内容' – 2013-05-13 02:08:44
您需要某种类型的库/数据库来存储有效的名称供您检查。如果您决定不使用图书馆或数据库,那么技术上用户可以输入他们想要的任何字词。 – jason328 2013-05-13 02:15:29
嗯,我不在乎名称=“a”,我只想输入一个有效的字符串。所以我不认为一个名称库是必要的 – 2013-05-13 02:20:00
这一切都取决于你的意思空。如果你的意思是叫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
)等。
我不想设置一个默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如name =“”而不是像name =“Paul”这样的有效名称。如果一个空字符串通过它只是不断让用户重新输入有效的信息,直到他们输入正确的' – 2013-05-13 02:05:08
基于什么其他的答案都在做,最好的办法是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?
。
我不想设置一个默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如name =“”而不是像name =“Paul”这样的有效名称。如果一个空字符串通过它只是不断让用户重新输入有效的信息,直到他们输入正确的' – 2013-05-13 02:05:27
只是出于好奇,为什么比def初始化更好(名称=“杰夫”) – 2013-05-13 02:06:32
我想这不是:) 更新。 – 2013-05-13 03:54:01
如果没有设置默认名称,并且在发送空字符串(而不是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:'初始化':名称不能为空字符串( RuntimeError)
from temp.rb:11:in `new' from temp.rb:11:in `<main>'
外壳返回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
为什么不接受构造函数/初始化方法中的用户名?
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'通过,会抛出异常吗? ...你能更具体一点吗? – 2013-05-13 01:46:23
@LoganSerman我不想有一个默认值,我知道该怎么做。我想知道,如果你通过“”而不是“保罗”如何捕获该异常,并让该人员重新输入该值,直到他们输入了有效的内容 – 2013-05-13 01:56:28
如果存在无效参数,则发出错误。 – 2013-05-13 02:00:23