如何在 ruby 中编写一个采用哈希样式、方括号参数的方法,例如 mymethod[arg]?
How to write a method in ruby that takes hash-style, square bracketed arguments, like mymethod[arg]?
我想在 ruby 中编写一个方法来替换当前仅 returns 一个散列的方法。
所以目前我们有这个
def some_stats
{
:foo => "bar",
:zoo => "zar"
}
end
可以这样调用:
some_stats[:foo]
我想用一个用 :foo 调用的方法替换它,它做一些更复杂的事情,只是构建一个散列。但是,我希望以相同的方式调用它,使用方括号表示法。 EG
#this is a bit pseudo-cody but hopefully you get the idea.
def some_stats[](key)
if key.to_s =~ /something/
#do something
return something
else
#do something else
return something_else
end
end
这仍然会被称为 some_stats[:foo]
我无法计算出定义方法名称的语法:上面的 def some_stats[](key)
不起作用。我觉得这应该是可能的。
你很接近。 object[sth]
只是 object.[](sth)
的语法糖。因此,要执行您需要的操作,您必须定义 some_stats
方法,即 returns 定义 []
方法的对象:
class Stats
def [](key)
if key.to_s =~ /something/
#do something
return something
else
#do something else
return something_else
end
end
def some_stats
Stats.new
end
some_stats[:something_new] #=> something
some_stats[:not_new] #=> something_else
你原来的方法不是用方括号调用的;它被称为 没有任何参数 ,但是 return 是一个对象(在你的例子中是 Hash
),它定义了方法 :[]
,因此可以理解方括号。您的方法调用等同于
(some_stats())[:foo]
或者更明确地说,
x = some_stats()
x[:foo]
因此您需要 - 在您的方法中 return 一些 class 的实例,它提供 []
方法。假设您编写了一个名为 MyClass
的 class,其中定义了一个 []
。然后你可以写一个函数
def some_stats
if _your condition goes here_
{ ... } # Return your Hash
else
Myclass.new
end
end
这将用作
some_stats[:whatever]
但是,要真正有用,您的条件将使用该方法的参数,即
def some_stats(param)
if param < 4000
{ ... } # Return your Hash
else
Myclass.new
end
end
您可以通过
调用它
some_stats(4711)[:whatever]
我想在 ruby 中编写一个方法来替换当前仅 returns 一个散列的方法。
所以目前我们有这个
def some_stats
{
:foo => "bar",
:zoo => "zar"
}
end
可以这样调用:
some_stats[:foo]
我想用一个用 :foo 调用的方法替换它,它做一些更复杂的事情,只是构建一个散列。但是,我希望以相同的方式调用它,使用方括号表示法。 EG
#this is a bit pseudo-cody but hopefully you get the idea.
def some_stats[](key)
if key.to_s =~ /something/
#do something
return something
else
#do something else
return something_else
end
end
这仍然会被称为 some_stats[:foo]
我无法计算出定义方法名称的语法:上面的 def some_stats[](key)
不起作用。我觉得这应该是可能的。
你很接近。 object[sth]
只是 object.[](sth)
的语法糖。因此,要执行您需要的操作,您必须定义 some_stats
方法,即 returns 定义 []
方法的对象:
class Stats
def [](key)
if key.to_s =~ /something/
#do something
return something
else
#do something else
return something_else
end
end
def some_stats
Stats.new
end
some_stats[:something_new] #=> something
some_stats[:not_new] #=> something_else
你原来的方法不是用方括号调用的;它被称为 没有任何参数 ,但是 return 是一个对象(在你的例子中是 Hash
),它定义了方法 :[]
,因此可以理解方括号。您的方法调用等同于
(some_stats())[:foo]
或者更明确地说,
x = some_stats()
x[:foo]
因此您需要 - 在您的方法中 return 一些 class 的实例,它提供 []
方法。假设您编写了一个名为 MyClass
的 class,其中定义了一个 []
。然后你可以写一个函数
def some_stats
if _your condition goes here_
{ ... } # Return your Hash
else
Myclass.new
end
end
这将用作
some_stats[:whatever]
但是,要真正有用,您的条件将使用该方法的参数,即
def some_stats(param)
if param < 4000
{ ... } # Return your Hash
else
Myclass.new
end
end
您可以通过
调用它some_stats(4711)[:whatever]