我在學習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
我敢肯定那些會拋出一些有趣和更好的答案的人,但這裏是我的。
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