小编Lea*_*lia的帖子

如果进程终止,是否可以执行整个ensure块?

今天我在Pharo中了解到执行:

[v := 1] ensure: [self halt. v := 2]
Run Code Online (Sandbox Code Playgroud)

v = 2,即使我们在halt窗口放弃过程(!),也会结束设置.

我发现这个值得商榷.对我来说,语义#ensure:意味着序列

self halt. v := 2
Run Code Online (Sandbox Code Playgroud)

必须执行,无论接收器块的情况如何,都不管参数块的逻辑如何.由于逻辑#halt包括终止过程的事件,我发现它对第二句的顽固评价具有侵扰性.

接下来我尝试了以下内容:

[v := 1] ensure: [1 / 0. v := 2]
Run Code Online (Sandbox Code Playgroud)

ZeroDivide异常弹起我关上了调试器,仍然值v2(同用#halt.)

最后,我评估了:

[v := 1] ensure: [n := 1 / 0. v := v + n]
Run Code Online (Sandbox Code Playgroud)

并在ZeroDivide异常上关闭调试器.这次的价值v是,1但我v + n无法评估无法评估的事实.换句话说,错误继续无声.

所以我的问题是.这种行为背后的理性是什么?该过程是否应该在"正常"情况下终止,即没有#ensure:涉及?

smalltalk pharo

5
推荐指数
1
解决办法
109
查看次数

在Pharo中创建多个变量会给我一个"变量或表达式预期"错误

我很困惑为什么这个代码似乎在孤立的情况下正常工作,但是当我把它放在一起时我得到一个错误.

以下片段打印'Hello World!' 打印时:

| blah |
blah := 'Hello '.
blah, 'World!'.
Run Code Online (Sandbox Code Playgroud)

但是下面的代码块给了我预期的变量或表达式错误

| blah |
blah := 'Hello '.
blah, 'World!'.
| blah2 |
blah2 := 'World!'.
blah, blah2.
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?

smalltalk pharo

5
推荐指数
1
解决办法
162
查看次数

如何在Smalltalk OrderedCollection中打印出来时在元素之间添加空格?

我已经创建了一个OrderedCollection列表,现在我想通过使用Transcript将其打印出来,如下所示:

  range do:[:each|Transcript show: each].
Run Code Online (Sandbox Code Playgroud)

输出是35791113,但我需要3 5 7 9 11 13,所以我需要元素之间的空格.我也尝试过..

   Transcript show: range.
Run Code Online (Sandbox Code Playgroud)

但是我没有OrderedCollection(3 5 7 9 11 13),而是只有列表元素,没有OrderedCollection.怎么做到这一点?

smalltalk

4
推荐指数
1
解决办法
231
查看次数

扩展默认类(SmallInteger)

我正在尝试使用新的实例方法"square"扩展SmallInteger类.我的想法是,我希望能够称之为"5平方"并且它将返回25.

使用实例方法扩展自己的类非常简单,因为您知道变量名,但我不知道SmallInteger类中的变量名.我怎么才能找到它们?

我认为它看起来应该是这样的,但是'thisNumber'引用了这个SmallInteger对象恰好是什么数字.

SmallInteger extend [
    square [
        | r |
        r := thisNumber * thisNumber.
        ^r
    ]
]
Run Code Online (Sandbox Code Playgroud)

smalltalk gnu-smalltalk

4
推荐指数
1
解决办法
294
查看次数

Pharo系统调整选项

我是StackOverflow的新手,正在寻找技巧并帮助在Windows环境中调优Pharo 5.0.

我的PC运行的是Windows 10,CPU为I5-4670K(4 Ghz),而Plextor 512G SSD为C驱动器,其中Pharo 5.0已加载并运行.

下面是我用来理解Pharo在性能和计算精度方面的行为的一组代码.

  | x y |
  x := 0.
  y := 400000000.
  [1 to: 2000000000 do: [ :i | 
      x := x + 0.2]] timeToRun
Run Code Online (Sandbox Code Playgroud)

执行需要2分钟8.281秒.如果我从迭代次数中剔除一个零,那么完成只需1.762秒.迭代次数超过执行时间的70倍以上.似乎我遇到了一个系统边界,这样两个案例之间的执行时间增长远远超过10倍.

欣赏任何提示,并帮助微调Pharo 5.0 VM,以便我可以减少这种意外和不良的系统行为?

ps在执行期间,Windows任务管理器未报告磁盘活动的任何更改.几乎所有执行都是RAM和CPU操作.顺便说一句,除非你有一个更快的PC,请不要尝试在迭代次数上添加另一个零,花了这么长时间我不得不打破执行.

smalltalk performance-testing pharo

4
推荐指数
1
解决办法
154
查看次数

Pharo Smalltalk:从TextMorph读取

在使用Pharo的Smalltalk中,我正在创建一个读取用户输入并执行X的应用程序.

到目前为止,我已经设法创建了一个用户可以输入值的TextMorph,但我不确定如何从TextMorphs读取然后对该值执行某些操作.

有任何想法吗?

谢谢

windows smalltalk squeak pharo

3
推荐指数
1
解决办法
412
查看次数

如何从 Smalltalk 中的 URL 获取图像?

我有一些 URL 字符串,如何从 URL 获取图像?我正在使用 VisualWorks 9.2

smalltalk visualworks

3
推荐指数
1
解决办法
47
查看次数

工作区没有为我返回正确的值

我有一些代码的问题。

如果我写, Recenzes select: [:a | a komponenta nazev = 'Hitachi P21']我会得到一些正确的记录。但如果我使用这样的东西:

| brzdy |
brzdy := (((
   (Sekces select: [:b | b nazev = 'Brzdy']) collect: [:b | b komponenty]) flatten)
       select: [:c | c vyrobce nazev = 'Hitachi']) collect: [:d | d nazev].
Run Code Online (Sandbox Code Playgroud)

我可以使用 ^ 命令获得“Hitachi P21”。但是如果我在这里使用变量“brzdy”:Recenzes select: [:a | a komponenta nazev = brzdy]我什么也得不到。

简而言之。我想显示“Komponenty”的“Recenzes”,它们位于“Sekces”中,值为“Brzdy”,它们保存在“Recenzes”和“Sekces”的“Komponenty”(集)列中。

有谁知道为什么?

smalltalk

3
推荐指数
1
解决办法
47
查看次数

Squeak Smalltalk,为什么有时减少的方法不起作用?

(2332 / 2332) reduced 
(2332 / 2) reduced 
(2332 / 322) reduced  (1166/161)
(2332 / 3) reduced  (2332/3)
(2332 / 2432423) reduced  (2332/2432423)
Run Code Online (Sandbox Code Playgroud)

看看上面的代码.打印时,第一个和第二个不起作用.弹出MessageNotUnderstood窗口.第3,第4,第5个代码没问题.结果出来了.

为什么这个reduced方法不起作用?

是因为简化方法无法处理像Uko猜测这样的整数的最终结果吗?

smalltalk squeak fractions

2
推荐指数
1
解决办法
122
查看次数

如何使用作为数组的实例变量

我想创建一个smalltalk应用程序,其中一个类具有一个实例变量,该实例变量是一个数组,一个实例变量是数组的大小.理想情况下,我希望在创建对象时初始化这些对象,但我会在方法中手动初始化这些对象.

以下是我的代码:

Object subclass: Student [
    | numTests marks |


    initialize [
        numTests := 0.
        marks := Array new: 10.
    ]
]
student := Student new.
student initialize.
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

Object: Array new: 10 "<0x10b054b80>" error: method is responsibility of a subclass
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

arrays smalltalk gnu-smalltalk

2
推荐指数
1
解决办法
167
查看次数