2014-03-03 63 views
0

是否有可能在Ruby来定义这样的setter和类吸气剂可与[]()或不服一样被使用?例如。红宝石括号设定器/吸气

word.meaning[:english] = "ruby" 
puts word.meaning[:german] # "Rubin" 

请注意word.meaning一定不能是散列!和:english,:german是用于设置者/获取者meaning的一类附加参数。

+0

如何' “鲁宾”'从信息'衍生自:english',' “红宝石”'和':german'?根本不清楚你在做什么。 – sawa

+0

@sawa OP在类实例中要求使用“setter”和“getter”方法。 'word.meaning [:german]#“Rubin”是一个使用“getter”方法的例子。 – Kyle

+0

是否“不得”读取“不必”? –

回答

2

是的,它可以做到。您需要定义[]=[]方法。

在这个例子中,我使用的是Hash作为内部数据结构 - 您可以自由使用任何你喜欢的。

class Word 
    attr_reader :meaning 

    def initialize 
    @meaning = Meaning.new 
    end 
end 

class Meaning 
    attr_reader :h 

    def initialize 
    @h = {} 
    end 

    def []=(key, value) 
    @h[key] = value 
    end 

    def [](key) 
    @h[key] 
    end 
end 

实施例:

word = Word.new 
word.meaning[:english] = 'Hello' 
word.meaning[:english] # => 'Hello' 
+0

OP明确指出'word.meaning一定不能是散列'(尽管目前还不清楚为什么必须是这种情况以及OP在做什么)。看起来OP似乎期待着setter和getter不处理完全相同的事情,但他们在某种程度上是相关的。我认为你不了解这个问题。我也没有。 – sawa

+1

@sawa和我的对象不是哈希。 “word.meaning”可以是任何事物的一个实例 - 例如“Foo”。 **我的例子中的散列纯粹是一个实现细节**至于理解这个问题 - 我明白它。 OP可以很容易地实现getter来检查':english'键并翻译为':german' – Kyle

+0

它只是一个散列的包装。我相信你所做的正是OP不想做的。 – sawa