Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 自定义类,要求将字符串附加到属性或设置为数组,但不要求其他内容_Ruby - Fatal编程技术网

Ruby 自定义类,要求将字符串附加到属性或设置为数组,但不要求其他内容

Ruby 自定义类,要求将字符串附加到属性或设置为数组,但不要求其他内容,ruby,Ruby,我有一个自定义类:User 我希望允许用户将关键字附加到属性“keywords”或用数组替换所有关键字。 我不希望用户将属性设置为单个字符串或数字 根据我所读的内容,我认为我需要创建一个自定义setter方法 以下是我到目前为止的情况: class User attr_accessor :username, #strings :id, :primary_group, :first_

我有一个自定义类:User 我希望允许用户将关键字附加到属性“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

如果属性“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"]