Date dayMonthYearDo 的正确参数是什么:在 Smalltalk 中看起来像什么(Pharo / Squeak)

What do the correct arguments for Date dayMonthYearDo: look like in Smalltalk (Pharo / Squeak)

Date dayMonthYearDo: aBlock 
"Supply integers for day, month and year to aBlock and return the result"

^ start dayMonthYearDo: aBlock

此消息的典型有效块应该是什么样的?

像这样:

Date today dayMonthYearDo: [:d :m :y| Transcript cr; 
        show: 'today is the ';
        show: d;
        show: 'th'
        ]

today is the 28th

但当然你可以做不同的事情,只是在成绩单上展示一些东西

在这种情况下,注释 "Supply integers, etc." 表示参数 aBlock 将接收三个整数作为 "actual" 参数:天数月指数。这意味着您必须创建一个包含三个 "formal" 参数的块,例如 daymonthIndexyear,如:

aDate dayMonthYearDo: [:day :monthIndex :year | <your code here>]

你在<your code here>里面写的代码可以引用"formal"参数daymonthIndexyear,就像是一个方法一样有了这三个参数。

这就是块在 Smalltalk 中的一般工作方式。

例子

aDate
    dayMonthYearDo: [:day :monthIndex :year |
        monthIndex + day = 2
            ifTrue: [Transcript show: 'Happy ' , year asString, '!']]

更新

上面的示例通过 "ingeniously" 比较 monthIndex + day2 来检查 1 月 1 日。事实上,由于两个变量都 >= 1,所以获得 2 的唯一方法是当 daymonthIndex 都是 1 时,即当接收者 aDate 是 1 月 1 日。更 "serious" 的方法看起来像

(monthIndex = 1 and: [day = 1]) ifTrue: [ <etc> ]