我目前正在使用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>'
答案 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
。)
答案 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上发布它。