3

私が現在受講しているクラスでは、すべてのコーディングを smalltalk で行う必要があります (これはデザイン クラスです)。私たちのプロジェクトの 1 つで、私はいくつかのことをしようとしていますが、その方法を見つけるのに苦労しています。ほとんどの人は、自分のバージョンの smalltalk を変更して、必要なことを実行しているようです。教授が私と同じ組み込みメソッドを持っていない場合、教授のコンピューターでエラーが発生するため、これを自由に行うことはできません。

これが私がやろうとしていることです:

乱数。1 から 1000 までの乱数を作成する必要があります。

rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.

これにより、0 から 1000 までの数値が得られます。1 つのコマンドでこれを行う方法はありますか? に似ている

Random between: 0 and: 1000

And/Or ステートメント。これは私から生きている日光を悩ませます。私はいくつかの異なる構成を試しました

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

だから私はネストされた ifTrue ステートメントでそれを偽造しています:

(statement) ifTrue:[
    (statement) ifTrue:[...

smalltalk で and/or and Random を行う正しい方法は何ですか?

4

6 に答える 6

6

問題はそれです

 (expr) and: (expr) ifTrue: aBlock

はメソッドとして解析されand:ifTrue: ますブールクラス(特にTrueまたはFalse)を見ると、ifTrue:は単なる通常のメソッドであり、メソッドand:ifTrue:は存在しませんが、プレーンand:は存在します。したがって、これらが2つのメッセージであることを明確にするには、次のように記述します。

((expr) and: (expr)) ifTrue: aBlock

より長いブール値の組み合わせについては、メソッドand:and:and and:and:and:が実装されていることに注意してください。

于 2008-11-07T06:51:45.880 に答える
6
(1 to: 1000) atRandom
于 2008-11-22T09:09:54.813 に答える
5

VisualWorks を使用していて、かつ: が引数としてブロックを取る場合は、次のように記述します。

(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].

&ブロックを引数にとらないもありますが、

aBoolean & anotherBoolean ifTrue:[doSomething].

違いは and です: 最初の bool が true の場合にのみ (Java と同様に) ブロック内にあるものを評価しますが、&常に両方を評価します。

したがってand:、2 番目の条件が計算コストが高い場合、または最初の条件が true の場合にのみ発生する必要がある状態変更が含まれている場合に便利です。(しかし、それは通常悪い設計です)。

Random >> between: and:Random については、カスタム メソッドと残りのコードを配信する限り、教授のコンピューターで問題なく動作します。具体的にどのように行うかは、課題を提出することになっている形式によって異なります。

于 2008-11-12T22:38:18.403 に答える
4

ランダムの問題については、使用している ST のバージョンによって異なります。Squeak 3.9 にはRandom>>#nextInt:、「間隔 [1, anInteger] 内のランダムな整数に答える」として文書化されている があります。その実装は読み取ります

(self next * anInteger) truncated + 1

だから私はここに2つのコメントがあります:

  1. クラスブラウザの使い方を本当に学ぶべきです。これにより、「クラス X のオブジェクトにどのようなメッセージを送信できるか」という (よくある) 質問に答えることができます。
  2. ST では、新しいメソッドを既存のクラスに追加するのが一般的です。したがって、Random に between:and: を持たせたい場合は、次のように追加するだけです。

    between: low and: high      
       ^(self next * (high-low+1)) truncated + low
    
于 2008-11-07T08:15:41.390 に答える
0

1 から 1000 までの整数の乱数を作成
するには まず、乱数系列を作成します。これを一度だけ行ってください。

次に、シリーズから次の番号を取得して、新しい乱数を作成します。必要に応じて繰り返します。

aRandomSeries := Random new .
    "Seed a new series of random numbers"  

aRandomInt := aRandomSeries newInt: 1000 . 
    "generate a random integer between 0 and 1000"

anotherRandomInt := aRandomSeries newInt: 1000 .
    "generate another random integer between 0 and 1000"

論理演算

aBooleanと に応答しand:ますor:どちらもブロック引数を取ります。

ここにそれらがどのように機能するかを示します。

and: alternativeBlock
レシーバーが true の場合、alternativeBlock の値に応答します。それ以外の場合は、alternativeBlock を評価せずに false と答えます。

or: alternativeBlock
受信者が false の場合、alternativeBlock の値に答えます。それ以外の場合は、alternativeBlock を評価せずに true と答えます。

例えば
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]

ただし、Squeak と Pharo Smalltalk はどちらも括弧内の引数を受け入れますが、( )
Dolphin Smalltalk は受け入れず、ブロック引数の標準 Smalltalk 構文を厳密に必要とします。

その他の関連メソッド:
&角括弧 (ブロック) 引数を必要としないAND角括弧 (ブロック) 引数を必要としない
|OR、Amber、Cuis、Gnu、Pharo、Squeak、VisualAge、および VisualWorks Smalltalk で機能します。
&|

Squeak Smalltalk も提供します:
and:and: }
and:and:and: } これらは複数のブロック引数を取ります
and:and:and:and }

or:or: }
or:or:or: } これらは複数のブロック引数を取ります
or:or:or:or: }

于 2015-11-22T13:30:35.027 に答える
0

簡単に言えば、Smalltalk の方言を知らないので、一般論しか答えられません。あなたがランダムな質問を述べた方法、はい、あなたの教授が一般的な答えを必要とする場合、それを行う唯一の方法です.

and/or ステートメントの質問については、

And/Or ステートメント。これは私から生きている日光を悩ませます。私はいくつかの異なる構成を試しました

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

試してみたいことは次のとおりです。

(statement) and: [statement] ifTrue: [ ... ]

and: メソッドは引数としてブロックを取ります。

于 2015-11-23T07:54:54.490 に答える