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

时间:2015-07-18 03:42:18

标签: 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
      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>'

3 个答案:

答案 0 :(得分:2)

http://ruby-doc.org/core-2.2.2/Object.html Object#send是您正在寻找的方法。

由于您需要一个&#39;类方法,因此在声明包含&#39;类方法的类的实例方法时,Object应该是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?]
  ]

样式因人而异,但我认为在使用多行块时,最好使用&#39; do,end&#39;对而不是&#39; {}&#39;

https://github.com/bbatsov/ruby-style-guide

我认为有些混淆可能来自看起来像这样的代码

foobar = ->(foo,bar){puts "Passed in #{foo}, #{bar}"}
foobar.call("one","two")

如果第一行被抽象到程序的其他部分,你可能会认为foobar是一种方法,但它真的是一个lambda。 Procs和Lambdas就像方法一样,但更好......以自己的方式..查看关于Procs,Blocks和Lambdas的这篇文章。

http://www.reactive.io/tips/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

但如果有兴趣,请查看https://www.codecademy.com/forums/ruby-beginner-en-L3ZCI以获取有关PBLS的详细信息

答案 1 :(得分:0)

没有方法不是方法;并且 Symbol#call导致立即错误。

(或更确切地说, a )调用方式是通过Object#__send__提供名称和参数。人们也可以解决一个方法然后调用它;但__send__是最直接的路线,因为Ruby基于message passing

即代替symbol.call(..),使用obj.__send__(symbol, ..)。 (在这种情况下,对象可能是self。)

请参阅Understanding Ruby symbol as method call

答案 2 :(得分:0)

您可以使用SELECT SUBSTR(anm_catogery, 3) || 's', COUNT(*) FROM x GROUP BY anm_catogery

from = "1.txt"
to = "2.txt"
data = open(from).read
out = open(to, 'w')
out.write(data)
out.close
data.close

虽然我不确定这是你写的应用程序的最佳方法。当你开始工作时,你可以在CodeReview上发布它。