Ruby on rails 如何使用存储在数组中的方法名调用Ruby中的类方法?
我目前正在用Ruby开发一款扑克游戏。我没有使用大量的if-else语句来检查玩家手牌的值,而是决定执行以下操作:Ruby on rails 如何使用存储在数组中的方法名调用Ruby中的类方法?,ruby-on-rails,ruby,methods,Ruby On Rails,Ruby,Methods,我目前正在用Ruby开发一款扑克游戏。我没有使用大量的if-else语句来检查玩家手牌的值,而是决定执行以下操作: #calculate the players score def score POSS.map {|check| if (check[1].call()) @score = check[0] puts @score return check[0] else false
#calculate the players score
def score
POSS.map {|check|
if (check[1].call())
@score = check[0]
puts @score
return check[0]
else
false
end
}
end
POSS = [
[10, :royal_flush?],
[9, :straight_flush?],
[8, :four_kind?],
[7, :full_house?],
[6, :flush?],
[5, :straight?],
[4, :three_kind?],
[3, :two_pairs?],
[2, :pair?]
]
“POSS”每个项目中的第二个项目是我创建的一个方法,用于检查玩家是否拥有该手牌。我试图使用.call()调用该方法,但出现以下错误:
Player.rb:43:in `block in score': undefined method `call' for
:royal_flush?:Symbol (NoMethodError) from Player.rb:42:in `map' from
Player.rb:42:in `score' from Player.rb:102:in `get_score' from
Player.rb:242:in `<main>'
Player.rb:43:in'block in score':未定义的方法'call'
:royal_flush?:来自玩家的符号(nomethoderor)。rb:42:“地图”中来自
玩家。rb:42:在玩家的“得分”中。rb:102:在玩家的“得分”中
玩家:rb:242:in`'
没有方法就是没有方法;并且没有导致立即错误的Symbol#call
调用(或者更确切地说,是一种)方法是via,提供名称和参数。也可以解析一个方法,然后调用该方法;但是,正如Ruby所基于的那样,\uuuuuuu发送\uuuuuuu
是最直接的路由
也就是说,不要使用symbol.call(..)
,而是使用obj.\uuu\uu发送(symbol,…)
。(在这种情况下,对象可能是self
)
请参见您可以使用
发送
class Foo
def self.bar
"bar"
end
def baz
"baz"
end
end
Foo.send(:bar) # => "bar"
f = Foo.new
f.send(:baz) # => "baz"
虽然我不确定这是否是你正在编写的应用程序的最佳方法。当它工作时,你可以发布它。Object#send
是你正在寻找的方法
因为您需要一个“类方法”,所以在声明包含“类方法”的类的实例方法时,对象应该是self
试试这个代码
#calculate the players score
def score
POSS.map do |check|
if self.send check[1]
@score = check[0]
puts @score
return check[0]
else
false
end
end
end
POSS = [
[10, :royal_flush?],
[9, :straight_flush?],
[8, :four_kind?],
[7, :full_house?],
[6, :flush?],
[5, :straight?],
[4, :three_kind?],
[3, :two_pairs?],
[2, :pair?]
]
风格因人而异,但是,我认为在使用多行块时,最好使用“do,end”对而不是“{}”
我认为这样的代码可能会引起一些混乱
foobar = ->(foo,bar){puts "Passed in #{foo}, #{bar}"}
foobar.call("one","two")
如果第一行被抽象到程序的其他部分,您可能会认为foobar是一个方法,但它实际上是一个lambda。Procs和lambda就像方法一样,但更好。。以他们自己的方式。。查看这篇关于进程、块和lambda的文章
但如果有兴趣,请查看PBL的更多详细实践它仍然会给我同样的错误。我有皇室同花顺吗?定义较早,单独测试时有效。下面是我的调用与您建议的更改的样子:POSS.map{| check | if(Player.send check[1])@PowerProject没有方法就是没有方法。如果它给出相同的错误(这将是相同类型的错误,但对于不同的接收方对象和方法名称)然后看前面。当使用
obj.\uuu send.\uuuuu(:x)
时,名为x
的方法必须出现在obj
上。在这种情况下,您可能不想使用Player
(类),而是一个特定的播放器实例。如果确实要使用类,请确保使用了类方法。问题是我正在执行player.send,而不是前面提到的self.send@Schylar@PowerProject请参阅相关的链接文档。这就是\uuuu send\uuuu
的工作原理。太好了,非常感谢!感谢您的支持建议和链接,我一定会检查这些!