Ruby 自定义类,要求将字符串附加到属性或设置为数组,但不要求其他内容
我有一个自定义类:User 我希望允许用户将关键字附加到属性“keywords”或用数组替换所有关键字。 我不希望用户将属性设置为单个字符串或数字 根据我所读的内容,我认为我需要创建一个自定义setter方法 以下是我到目前为止的情况:Ruby 自定义类,要求将字符串附加到属性或设置为数组,但不要求其他内容,ruby,Ruby,我有一个自定义类:User 我希望允许用户将关键字附加到属性“keywords”或用数组替换所有关键字。 我不希望用户将属性设置为单个字符串或数字 根据我所读的内容,我认为我需要创建一个自定义setter方法 以下是我到目前为止的情况: class User attr_accessor :username, #strings :id, :primary_group, :first_
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
如果属性“Keywords”只接受一个数组,我该如何设置它?还是向数组中添加对象?(它应该以一个空数组开始。)对于您的代码,您可以像这样使用它:
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 #[]
类用户
属性阅读器:关键字
def初始化()
@关键词=[]
结束
def您的问题是什么?这一行有一个拼写错误:if(new\u keyword.kind\u of?(Array))
添加了实际问题。这两种方法中的任何一种都允许我使用内置数组方法添加关键字吗?i、 关键字.push('student')、关键字.insert(-1,'student')、关键字.pop等等。试试看。是的,应该可以使用usr.keywords.push('student')
usr.keywords
返回数组@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"]