自定义类,需要追加字符串属性或设置为数组,但没有别的

时间:2014-05-08 20:29:30

标签: ruby

我有一个自定义类:用户 我想允许用户在属性“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

如何在“关键字”属性只接受数组的位置?或者向数组中添加一个对象? (它应该以空数组开头。)

1 个答案:

答案 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"]