我有一个实例变量'a'的类.
当我使用new创建类的新实例时,调用的方法的顺序是什么?
对象如何知道它应该调用initialize方法?
如果我创建一个类方法来为我的实例变量赋值,是否仍会为我的类方法未调用的其他实例变量调用初始化?
我正在读一本关于Smalltalk的书,我正在练习关于我无法解决的消失元素的异常.
Object subclass: Book [
| isbn |
<comment: 'A book class'>
setIsbn: anIsbn [
isbn := anIsbn.
]
getIsbn [
^isbn.
]
= anotherBook [
^self getIsbn = anotherBook getIsbn.
]
]
| Library |
Library := Set new: 100.
Library add: (Book new setIsbn: '0-671-2-158-1').
(Library includes: (Book new setIsbn: '0-671-2-158-1')) printNl.
Run Code Online (Sandbox Code Playgroud)
我读过我也要覆盖这个hash方法,但我不知道怎么做.如何修改Book课程以避免异常?
我需要帮助理解Smalltalk中变量的用法和差异.以下给定代码中每个变量的区别和用法是什么?
Object subclass: #MyClass
instanceVariableNames: 'x'
classVariableNames: 'Yy'
poolDictionaries: ''
category: 'helpMe'
MyClass class
instanceVariableNames: 'zzz'
Run Code Online (Sandbox Code Playgroud) 基本上我可以通过为它们分配一些东西来使用变量,例如:
x := something
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是在类中,如果我定义一个新方法,但是我没有声明变量,我得到一个"赋值给未声明的变量x",所以我必须使用:
|x| x := something
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我正在尝试运行一个应用程序Pharo,它需要来自运行它的主机的IP的数据.一般情况下,我必须打开代码,在我的Pharo代码中手动设置它,然后启动应用程序.是否有更好的编程方式获取IP地址并自动返回此地址而不管计算机是什么?假设我将其部署到不同的计算机上.
Array extend [
Array class >> bin: val left: l right: r [
^ super binSearch: val left: l right: r
]
binSearch: val left: l right: r [
|arr iter|
arr := self.
[l == r]
ifTrue: [^ (-1)].
iter := (r + l)/2.
[arr at: iter == val]
ifTrue: [^iter].
[arr at: iter < val]
ifTrue:[^ super binSearch val left: l right: iter]
ifFalse: [^ super binSearch val left: iter right: r]
]
]
arr := #(3 6 …Run Code Online (Sandbox Code Playgroud) 我必须使用Smalltalk返回第n 个斐波那契数,我以前没有使用过这种语言。该程序将1返回到任何输入,我不知道为什么。我认为它甚至没有迭代for循环。有人可以帮我吗?谢谢。
'Which fibonacci number do you want? (n>2)' printNl.
n := stdin nextLine asInteger.
(n <= 2)
ifTrue: ['Type a larger number, F(1) and F(2) equals 1!' displayNl.]
ifFalse: [
result:= 1.
parent := 1.
gparent := 1.
2 to: n do: [ :i | [
result := (parent + gparent).
gparent := parent.
parent := result.
'come on, do something' displayNl.
]
].
result displayNl.
].
Run Code Online (Sandbox Code Playgroud) 也就是说,如果我们将其视为所有对象和消息,那么
"Did this earlier: x := Array new: 20"
x at: 3 put: 123 "this will put 123 into slot 3"
Run Code Online (Sandbox Code Playgroud)
只有在x at: 3像"单元格"对象一样返回时才能工作,所以单元格可以接收一个Interger对象,即123.(或者,这样单元格对象可以让一些myContent属性指向123对象)
那么在这种情况下,怎么可能
y := (x at: 3) + 567
Run Code Online (Sandbox Code Playgroud)
工作?因为单元格如何处理+消息?是不是以某种方式,单元格对象认为它不知道如何处理+消息,所以它查看其内容(可能是类似的东西self myContent),然后返回它?它是如何工作的?我想知道是否有一个设计模式名称.
我想创建一个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)
我怎么解决这个问题?
如何让一个类使用2个不同的名称公开相同的方法?
例如,该asDescripton函数执行相同的操作/重新导出该asString函数,而无需简单地复制粘贴代码。
Object subclass: Element [
| width height |
Element class >> new [
^super new init.
]
init [
width := 0.
height := 0.
]
asString [
^ 'Element with width ', width, ' and height ', height.
]
asDescription [ "???" ]
]
Run Code Online (Sandbox Code Playgroud)