在构造函数中检查变量

在构造函数中检查变量

问题描述:

我在学习ruby,并知道在其他语言中我可以确保变量在初始化时不为空。在构造函数中检查变量

我该如何在Ruby中用这个例子来做这件事?

class Person 
    attr_reader :name 

    def initialize name 
    @name = name 
    end 
end 
+0

你的意思是你想提供一个默认值吗?如果'nil'通过,会抛出异常吗? ...你能更具体一点吗? – 2013-05-13 01:46:23

+0

@LoganSerman我不想有一个默认值,我知道该怎么做。我想知道,如果你通过“”而不是“保罗”如何捕获该异常,并让该人员重新输入该值,直到他们输入了有效的内容 – 2013-05-13 01:56:28

+1

如果存在无效参数,则发出错误。 – 2013-05-13 02:00:23

我敢肯定那些会抛出一些有趣和更好的答案的人,但这里是我的。

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 

然后通过namenew方法

Person.new(name) 

那么person将命名No name

+0

我不想设置默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如name =“”而不是像name =“Paul”这样的有效名称。如果一个空字符串被传入,它只是不断让用户重新输入有效信息,直到他们输入正确的内容' – 2013-05-13 02:08:44

+0

您需要某种类型的库/数据库来存储有效的名称供您检查。如果您决定不使用图书馆或数据库,那么技术上用户可以输入他们想要的任何字词。 – jason328 2013-05-13 02:15:29

+0

嗯,我不在乎名称=“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)等。

+0

我不想设置一个默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如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?

+0

我不想设置一个默认值。对不起,让我试着让这个更清楚些。我试图赶在他们没有输入有效名称时,比如name =“”而不是像name =“Paul”这样的有效名称。如果一个空字符串通过它只是不断让用户重新输入有效的信息,直到他们输入正确的' – 2013-05-13 02:05:27

+0

只是出于好奇,为什么比def初始化更好(名称=“杰夫”) – 2013-05-13 02:06:32

+0

我想这不是:) 更新。 – 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