“[]=”在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)