Smalltalk中是否真的没有预定义的动态2d容器?我必须自己制作吗?

时间:2018-01-19 14:14:19

标签: smalltalk pharo

我需要一个动态的2d容器,我很惊讶我在集合中找不到任何有用的东西。所以我用oldskool的方式制作了自己的东西,但不知怎的,我觉得必须有一些东西我不见了。 smalltalk pharo中的整个概念基于使用他们的东西,而不是必须建立自己的东西。

2 个答案:

答案 0 :(得分:3)

好的,所以你想拥有按行和列排列的对象集合(在你的情况下是变形)。这是一种方法

  1. 初始化:在类中创建一个实例变量来保存对象,并将其初始化为:

    morphs := OrderedCollection new
    
  2. 添加:通过类似这样的方法将新对象放入您的收藏中

    placeMorph: morph atRow: i column: j
      | row |
      row := morphs at: i ifAbsentPut: [OrderedCollection new].
      j - row size timesRepeat: [row add: nil].
      row at: j put: morph
    
  3. 请注意,通过nil完全j - row size次添加<= 0次(可能是i),可确保在jnil处存在一个广告位。

    1. 检索:获取网格中指定位置的对象或morphAtRow: i column: j | row | row := morphs at: i ifAbsent: [^nil]. ^row at: j ifAbsent: [nil]

      Dictionary
    2. 另一种可能性是使用morphs := Dictionary new ,如果网格很大且稀疏,这可能是有意义的。在这种情况下,您可以执行以下操作

      1. <强>初始化

        placeMorph: morph atRow: i column: j
          morphs at: i -> j put: morph
        
      2. <强>加成

        morphAtRow: i column: j
          ^morphs at: i -> j ifAbsent: [nil]
        
      3. <强>检索

        i -> j
      4. 请注意,我已将关联{i.j}用于关键字。另一种可能性是使用对$('.burger').on('click', function(e){ e.stopPropagation(); $('#menu').toggleClass('hide'); }); $(document.body).on('click', ':not(.burger)', function(e){ $('#menu').addClass('hide'); });

答案 1 :(得分:1)

Pharo有Matrix级。这几乎是一个2d容器,除非你在谈论我不理解的其他东西:)