Reflection Pharo:如何比较不同检查员中的对象?

Reflection Pharo:如何比较不同检查员中的对象?,reflection,smalltalk,pharo,inspector,Reflection,Smalltalk,Pharo,Inspector,我用的是法罗4号。假设我的对象已经实现了漂亮的相等和散列方法 如何直观地比较不同检查器中的两个或N个对象? 在视觉上,我指的是一个并排比较,我可以很容易地看到差异 我尝试了所有的安装,但过了一会儿就变得单调乏味了。我建议创建一个DifferenceFinder类,专门为您尝试比较其实例的类定制。例如,假设您想要比较点。然后您将拥有一个类PointDifferenceFinder,该类包含三个实例变量p、q、difference,并在 compare: aPoint with: anotherPo

我用的是法罗4号。假设我的对象已经实现了漂亮的相等和散列方法

如何直观地比较不同检查器中的两个或N个对象? 在视觉上,我指的是一个并排比较,我可以很容易地看到差异


我尝试了所有的安装,但过了一会儿就变得单调乏味了。

我建议创建一个
DifferenceFinder
类,专门为您尝试比较其实例的类定制。例如,假设您想要比较点。然后您将拥有一个类
PointDifferenceFinder
,该类包含三个实例变量
p、q、difference
,并在

compare: aPoint with: anotherPoint
  p := aPoint.
  q := anotherPoint.
  self compareClass ifFalse: [^self].
  self compareX ifFalse: [^self].
  self compareY ifFalse: [^self].
在哪里


当然,
的情况很简单,但这应该会给您带来更多的信息和想法。根据您的需要,您可以只使用一个简单的查找器,也可以使用一个更复杂的查找器。

在执行
GLMBasicExamples open
时,您可以选择不同的浏览器,从而获得灵感。使用Glamour,您可以轻松创建自定义浏览器来帮助您实现这一点。diff示例本身有15行代码:

| browser | 
browser := GLMTabulator new.
browser 
    row: [:r | r column: #one; column: #two];
    row: #diff.
browser transmit to: #one; andShow: [ :a |
    a list 
        display: #first ].
browser transmit to: #two; andShow: [ :a | 
    a list
        display: #second ].
browser transmit to: #diff; from: #one; from: #two; andShow: [ :a | 
    a diff
        display: [ :one :two | {one asString . two asString}] ].
browser openOn: #(#(abc def ghi) #(abc xyz))
glamour的diff视图使用DiffMorph来显示差异。它需要两个对象的字符串表示形式来进行比较

| browser | 
browser := GLMTabulator new.
browser 
    row: [:r | r column: #one; column: #two];
    row: #diff.
browser transmit to: #one; andShow: [ :a |
    a list 
        display: #first ].
browser transmit to: #two; andShow: [ :a | 
    a list
        display: #second ].
browser transmit to: #diff; from: #one; from: #two; andShow: [ :a | 
    a diff
        display: [ :one :two | {one asString . two asString}] ].
browser openOn: #(#(abc def ghi) #(abc xyz))