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