0

这是应该给出一副牌的代码:

class Cards
attr_accessor :value, :color

    def initialize(value, color)
    @value = value
    @color = color
end

end



2.upto(14) do |number|
recent = number
    1.upto(4) do |value|
        case value
        when 1
            color = :Spades
        when 2
            color = :Clubs
        when 3
            color = :Hearts
        when 4
            color = :Diamonds
        end             
        #{recent}of#{color} = Cards.new(recent, color)
        puts "#{recent}of#{color}"
    end
end 

它工作正常。但是当我尝试添加这一行时:

deck << #{recent}of#{color}

puts '#{recent}of#{color}'

突然出现一个疯狂的错误!

poker.rb:29: syntax error, unexpected kEND

而且我一点也不知道这条将对象移动到数组中的线如何导致它...

4

2 回答 2

1

我认为您没有意识到这一点,但以下行是一个注释,并且在执行期间被完全忽略(这是该行“有效”的唯一原因):

#{recent}of#{color} = Cards.new(recent, color)

定义局部变量时不能进行插值。事实上,在 Ruby 中根本无法动态定义局部变量(好吧,在 1.9+ 中不行)。

更广泛地说,你不能只使用开放插值(就像你试图用 做的那样deck << #{recent}of#{color})——插值只能发生在双引号字符串(或等效结构)或正则表达式中。

相反,只需将新卡直接铲入牌组:

deck << Cards.new(recent, color)
于 2013-02-16T01:56:01.453 回答
0

您需要双引号或字符串文字才能使用字符串插值:

deck << "#{recent}of#{color}"

或者

deck << %(#{recent}of#{color})
于 2013-02-16T01:33:39.743 回答