我来自Java和一些C ++,并且通过创建一个二十一点游戏来学习(一些)ruby。我一丝不苟地通过这个程序来了解ruby是如何工作的。
手头的代码是:
class Card
include Comparable
include Enumerable
attr_accessor :value
def initialize(v)
@value = v
end
def <=>(other)
if other.is_a?(Card)
@value <=> other.value
else
@value <=> other
end
end
def each
yield @value
end
def to_s
"#{@value}"
end
end
class Hand < Card
include Enumerable
attr_accessor :hand
def initialize
@hand = Array.new()
end
def clear_hand
@hand.clear
end
def add_to_hand(c)
if c.is_a?(Card)
@hand << c
else
raise "We have a problem - we received a non card object into our hand"
end
end
def each
@hand.each do |card|
yield card
end
end
def to_s
@hand.each do |c|
puts c
end
end
end
c1 = Card.new(3)
c2 = Card.new(0)
p = Hand.new()
p.add_to_hand(c1)
puts c1 # => 3
puts p # => 3 \n(new line) #<Hand:0x00000002b01ba0>
puts [1,2,3,4,5].include?(c1) # => true
puts [1,2,3,4,5].include?(p) # => false
我的问题:
为什么,当我使用'puts p'时,我得到一个ObjectID以及期望值'3'。它只对数组做这个(或者我到目前为止已经注意到了,但我确定有其他情况下它也返回ObjectID)。有人可以解释一下原因吗。
最后一行(当我们得到错误输出时)我希望它返回true - 这是因为我有一只手牌,里面装满了牌(此时只有一张牌),它确实包含了这张牌因此,我不知道我的代码有什么问题导致它返回false - 我会产生“hand”的每张卡片,我认为应该通过使用卡片的每个声明来产生该值?
如果不清楚,请告诉我们! 提前谢谢。
答案 0 :(得分:0)
它打印出您的对象,因为Array#each
方法返回对象本身。如果您只想返回Hand
中的卡片,只需返回数组或加入版本:
def to_s
@hand.join("\n")
end
答案 1 :(得分:0)
Object#to_s
说:
返回表示obj的字符串。默认to_s
打印对象的类和对象id的编码。
现在,如果你这样做:
p Hand.ancestors
#=> [Hand, Card, Enumerable, Comparable, Object, Kernel, BasicObject]
由于您未定义任何班级to_s
和Hand
Card
,因此Object#to_s
会调用puts
。只是为了证明它将下面的代码放在Hand
类中:
def to_s
"I am Hand class Object"
end
现在拨打puts p
,您会看到输出:I am Hand class Object
。
但Array#to_s
重载了Object#to_s
。从而打印出不同的输出。
现在遇到第二个困惑:
如果给定对象存在于self中(即,如果有任何object == object),则返回true,否则返回false。
在您的情况下,数组[1,2,3,4,5]
包含Fixnum
个对象。因此将调用Fixnum#==
。 Fixnum#==
说 如果修正等于其他数字,则返回true。 。但是p
您的Hand
类对象不符合上述条件,对于1==p
,2==p
等每个调用都是如此,因此false
值已经返回。
希望它能帮助您理解这个概念。