2013-05-13 118 views
1

我在學習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

回答

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


最後,如果你設置一個變量作爲零,例如

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

0

這一切都取決於你的意思。如果你的意思是叫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

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?

+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

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:'初始化':名稱不能爲空字符串( 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 
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