为什么Ruby方法不会改变原始数组?

时间:2016-09-23 12:07:10

标签: ruby methods shuffle

我正在创建一个游戏,以便练习一些基本的Ruby。在我的二十一点游戏中,我创造了一副牌来画画。我设法混合阵列,从该阵列中抽取并从原始卡阵列中删除两张卡的唯一方法如下:

function monthlyIceCreamSalesReport (scope, cb){
 var connObj = connConfig();
 connObj.conn.connect(function(err){
   if(err){
      console.log(err);
      return cb(Error("Something wrong"));
  }
  connObj.req.input('Month',4);
  connObj.req.input('Year',2016);

connObj.req.execute('<myStoredProcedure>', function(err, recordsets, returnValue){
    if(err){
        console.log(err);
        connObj.conn.close();
        return cb(Error("Something wrong"));
    }
    else {
        console.log(recordsets[0]); // successfully receiving the value

        connObj.conn.close();
        return cb(recordsets[0]);
    }
  });
});

}

var sqlServerObj = {
   monICSalesReport : monthlyIceCreamSalesReport,
};

module.exports = sqlServerObj;

我试着像这样使用shift和pop以及shuffle:

player_cards = cards.shuffle!.shift(2)

在IRB中,如果我使用pop和shift而不是shuffle,那么我试图从(哈希数组)中拉出的数组会从牌组中移除那些牌。一旦我添加随机播放,卡片就不再永久地从卡座上移除。我必须使用shuffle!为了完成我的任务。

我想知道的是,为什么不随着洗牌而按预期弹出和转移工作?我对Ruby中链接的基本理解是,卡片阵列首先被洗牌并返回,然后删除了数组中的元素。

我唯一想到的是我的错误可能是shuffle洗牌并返回一个洗牌阵列,但不是原来的卡阵列。当我从洗牌阵列中弹出或移动一张或两张牌时,它是由shuffle返回的数组,而不是原始的卡阵列。那是对的吗?

1 个答案:

答案 0 :(得分:1)

cards.shufflecards.shuffle!之间存在显着差异(撞击版本。)

前者创建一个新数组,而后者会改变原来的

也就是说,后面的代码shiftpop来自原始数组的副本,由shuffle生成。