“[]=”在Ruby中是如何工作的?
我的课程如下:“[]=”在Ruby中是如何工作的?,ruby,methods,Ruby,Methods,我的课程如下: class MyClass def [](key) '[] stub' end def []=(key, value) '[]= stub' end def foo self[:foo] #=>'[] stub' end def bar self[:bar]= 'bar'#=> '[]= stub' end end 有没有办法在不使用self的情况下重写MyClass#foo和MyClass#ba
class MyClass
def [](key)
'[] stub'
end
def []=(key, value)
'[]= stub'
end
def foo
self[:foo] #=>'[] stub'
end
def bar
self[:bar]= 'bar'#=> '[]= stub'
end
end
有没有办法在不使用self的情况下重写
MyClass#foo
和MyClass#bar
方法?您可以使用send
:
def foo
send(:[], :foo)
end
def bar
send(:[]=, :bar, 'bar')
end
但我将实现存储
和获取
,并将[]
和[]=
定义为别名:
def fetch(key)
# ...
end
alias_method :[], :fetch
def store(key, value)
# ...
end
alias_method :[]=, :store
并从类中调用fetch
/store
,而不是[]
/[]=
:
def foo
fetch(:foo)
end
def bar
store(:bar, 'bar')
end
你为什么不试试看呢?@pjs,我试过了,没有结果。请编辑以澄清“…没有自我存在”?显然,您必须显式(
self.
)或隐式(使用@Stefan解释的send
)引用self
),问题是当您在没有上下文的情况下编写[]时,ruby将其解释为空数组。但用自我来表达有什么不对?@Meier,我想你的问题是针对我的。(如果是,请包括@Cary so,so将通知我)。在各种情况下,需要包含self.
。你提到过一个。另一种是self.class…
只编写class…
会导致Ruby将class
解释为创建类时使用的关键字。另外,如果setx
是实例变量@setx
的设置器,并且您写入setx=4
,Ruby将创建一个局部变量setx
,并为其赋值4
。要使用setter,必须编写self.setx=4
。您还可以编写send(:setx=,4)
。