我正在使用来自http://gforge.inria.fr/frs/download.php/27025/Pharo-1.1-11367-Betadev10.05.1.zip的最新 Pharo 测试版图像(1.1)
现在,核心图像有一个更新按钮,可以将内容更新为最新技术。你在非核心图像上做什么?
我正在使用 Pharo+Squeak 学习 Smalltalk。我尝试使用游乐场/工作区作为控制台,并弄清楚如何在那里完成所有操作。我还没有弄清楚的一件事是如何向类添加方法。
假设我创建了一个Cat类
Object subclass: #Cat
instanceVariableNames: ''
classVariableNames: ''
package: 'User Defined'.
Run Code Online (Sandbox Code Playgroud)
makeSound要添加方法Cat,我可以在系统浏览器中找到它
Cat browse.
Run Code Online (Sandbox Code Playgroud)
并在那里创建一个新makeSound方法
makeSound
"Make Cat object make sound."
Transcript show: 'Meow!'.
Run Code Online (Sandbox Code Playgroud)
然后我可以实例化Cat并向其发送makeSound消息
cat := Cat new.
cat makeSound.
Run Code Online (Sandbox Code Playgroud)
它将Meow!显示在Transcript按预期
现在,我不知道如何使用“控制台”来完成所有这些操作。在《Pharo by Example》一书中提到,引用方法的约定是使用ClassName>>methodName,并且有一些代码片段看起来像这样(我可能正在屠宰它!)
Cat class>>makeSound
Transcript show: 'Meow!'.
Run Code Online (Sandbox Code Playgroud)
当我在游乐场/工作区中输入它时,它不起作用。
我想看看在 Seaside 中是否有可能在不使用会话或参数通道的情况下子组件获取对父组件的引用。也就是说,例如,子组件调用 self 获取父组件。
当我保存一个方法并稍后返回时,我所有的变量名都变成了 temp,我的所有参数都变成了 arg 并且代码缩进被更改了。关于如何解决这个问题的任何想法?
我在 ProfStef 的教程中注意到有时消息会发送到类而不是对象。我知道类也是对象,但是如果我没有先创建类的实例,类如何查找方法?这些方法是在类级别定义的吗?类似于Java的静态方法的东西?
我在编程方面没有太多经验,但我知道一点 Python3,现在我正在迈出我学习 Pharo 的第一步。我仍然不熟悉面向对象编程或类浏览器,但我已经阅读了 ProfStef 教程,并且我正在 Playground 上玩小程序,以熟悉语法。
我好奇的第一件事是这两种语言在速度方面的比较,因为我在某处读到 Pharo 内置了 JIT 编译器。 所以我用两种语言写了一个异想天开的脚本,生成了 800 万个数字,过滤其中的1/3,对每个计算1/sqrt(x),将结果相加,重复该过程一百次,每次稍微改变间隔,最后再将结果相加,并对整个过程进行计时. 不是一个合适的基准,只是一个获得数量级估计的练习,但我试图让两个版本尽可能相似。
Python 3 版本:
import time, math
mega = lambda n: sum([1/math.sqrt(1 + i + n) for i in range(8000000) if (i + 1) // 3 == 0])
start = time.time()
print(sum([mega(n + 1) for n in range(100)]))
stop = time.time() - start
print(stop)
Run Code Online (Sandbox Code Playgroud)
Python 3.8.5 的结果(默认,2020 年 7 月 28 日,12:59:40):
34.7701230607214
52.75216603279114
Run Code Online (Sandbox Code Playgroud)
Pharo 8 版本:
| mega range start stop |.
range …Run Code Online (Sandbox Code Playgroud) 我目前正在通过Pharo MOOC学习 Pharo ,在讲座“3.8 流概述”中,我们展示了以下用于创建文件的流操作示例:
| stream |
stream := 'hello.txt' asFileReference writeStream.
stream nextPutAll: 'Hello Pharo!'.
stream close.
Run Code Online (Sandbox Code Playgroud)
我在操场上执行了这个代码片段,然后我查看了安装 Pharo 的文件夹,在 Ubuntu 20.04 中的 ~/src/pharolauncher 下,检查文件是否已创建,但它在文件夹或其子文件夹中没有任何位置。
我这里有问题。
我有一个data类型的变量an OrderedCollection。
当我执行 DoIt: 时,此变量向我显示了这一点an OrderedCollection ('3c7lwmdva2b8jbt39ls4pz3sl' '3c7lwmbf36tamw1m45riirdze' 8 February 1994)。
现在我想要这样:
object:=String streamContents:
[:stream|
stream
nextPutAll: 'data:= ';cr;
print:data asArray.]
Run Code Online (Sandbox Code Playgroud)
但当我跑步时,它向我展示了这一点:
data := an Array End of statement list encounteencountered -> ('3c7lwmdva2b8jbt39ls4pz3sl' '3c7lwmbf36tamw1m45riirdze' 8 February 1994).
Run Code Online (Sandbox Code Playgroud)
所以这个月我想得到这个:
data := #('3c7lwmdva2b8jbt39ls4pz3sl' '3c7lwmbf36tamw1m45riirdze' 8 February 1994).
Run Code Online (Sandbox Code Playgroud)
请问怎么办?
我正在计划一个Seaside应用程序来保存文本,一个例子可能达到5Mb.什么样的物体最适合这个?
我还想对这段文字进行一些迭代.
谢谢,文斯
编辑:感谢您迄今为止的回复.该文件是一个CSV文件,从遗留财务系统生成大约需要40分钟,因此必须预先生成并存储.每条线都是客户记录,我需要将每一条线拉出来并在客户登录时使用这些值.客户访问是不可预测的,并且与遗留系统连接以生成每条线路是最后的手段.
我想重新定义smalltalk的nil,就像在objective-c中那样工作.因此,当nil收到无法处理的消息时,它返回nil.现在我知道这nil只是一个快捷方式,UndefinedObject但有没有像Ruby这样的东西method_missing,所以我可以重新定义它以便总是返回nil?UndefinedObject