Ruby on rails 如何使用存储在数组中的方法名调用Ruby中的类方法?

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

我目前正在用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
      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
的工作原理。太好了,非常感谢!感谢您的支持建议和链接,我一定会检查这些!