我有一个自定义类:用户 我想允许用户在属性“keywords”中附加关键字或用数组替换所有关键字。 我不想让用户将属性设置为单个字符串或数字。
从我读过的内容来看,我认为我需要创建一个自定义的setter方法。
这是我到目前为止所做的:
class User
attr_accessor :username, #strings
:id,
:primary_group,
:first_name,
:last_name,
:full_name,
:home_folder,
:shell,
:email_address
attr_reader :keywords
def keywords=(new_keywords)
if ( new_keywords.kind_of?(Array) )
@keywords = new_keywords
else
raise ArgumentError, "'#{new_keywords}' must be an array."
end
end
end
如何在“关键字”属性只接受数组的位置?或者向数组中添加一个对象? (它应该以空数组开头。)
答案 0 :(得分:1)
使用您的代码,您可以使用它:
usr = User.new
usr.keywords = %w{one two}
p usr.keywords #["one", "two"]
我建议另外一种用法:
class User
attr_reader :keywords
def initialize()
@keywords = []
end
def <<(keyword)
raise ArgumentError, "'#{keyword}' is no string" unless keyword.is_a?(String)
@keywords << keyword
end
def reset_keywords
@keywords = []
end
end
usr = User.new
p usr.keywords #[]
usr << 'one'
usr << 'two'
p usr.keywords #["one", "two"]
usr.reset_keywords
p usr.keywords #[]
替代:
class User
attr_reader :keywords
def initialize()
@keywords = []
end
#Add one or more keywords
def add_keyword(*keywords)
keywords.each{|keyword|
raise ArgumentError, "'#{keyword}' is no string" unless keyword.is_a?(String)
@keywords << keyword
}
end
#Alias for usage in plural
alias :add_keywords :add_keyword
def reset_keywords
@keywords = []
end
end
usr = User.new
p usr.keywords #[]
usr.add_keyword('one')
usr.add_keyword('two')
p usr.keywords #["one", "two"]
usr.reset_keywords
p usr.keywords #[]
usr.add_keywords('one', 'two')
p usr.keywords #["one", "two"]