Java.use(better, Scala); S4(E3) 15パズル

#Scalaの栞

Java.use(better, Scala); Season4(Episode1) 15パズル

変数を介して値を設定する

ときに、res3 とは何でしょうか。そこで、型を確認すると、

scala> :type res3
scala.swing.MainFrame

その変数を束縛している対象は、ウインドー MainFrame だと分ります。res3 は、隠れたウインドーを参照するための、隠れた変数です。というのも、対話形式では、実行した結果を後で参照できるように、隠れた変数が順に(res0, res1, ...)用意されるからです。

f:id:shiorichannel:20210222165803p:plain
変数と束縛

隠れた変数 res3 は、ウインドーに束縛されます。それなら、res3 を介して値を設定すると、隠れたウインドーが見えるようになるはずです。そこで、

scala> res3.visible = true

変数 res3 を介して、ウインドーの属性 visible に値 true を設定すると、ウインドーが現れます。このときの値 true は、真を表わす論理値です。同様に、

scala> res3.title = "A"

変数 res3 を介して、ウインドーの属性 title に値 "A" を設定すると、それがウインドーのタイトルに表示されます。二重引用符で囲まれた "A" は、文字列を表わします。すると、タイトルが違うのでウインドーを区別できます。
一般に、属性に値を設定(属性値を変更)するときには、次の書式に従います。

scala> オブジェクト.属性 = 値

この二重引用符には意味があります。というのも、それがないと、変数やモジュールなどと解釈されるからです。それを二重引用符で括ると「文字の並び」をそのまま解釈して欲しいという利用者の意図が、コンピューターに伝わります。
文字列のように、変数を介する必要がない、オブジェクトそのものを表現したものをリテラル〔literal〕と呼びます。そして、意味のあるオブジェクトはどれも、リテラルに帰着します。

変数を介して値を獲得する

変数を入力すると、その値が出力されます。これは、変数を評価したときに、その変数が束縛されている対象(オブジェクト)が得られるからです。
ときに、変数 res3 の値(型ではなく)は何でしょうか。変数 res3 を評価すると、その変数が束縛されているウインドーが得られます。そして、入力した変数を評価した結果として、得られたウインドーの情報が出力されます。このとき、

scala> res3
res4: scala.swing.MainFrame = scala.swing.Frame$$anon$1[frame2,0,22,128x37,layout=java.awt.BorderLayout,title=A,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,128x15,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=449,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
f:id:shiorichannel:20210222165848p:plain
異なる変数とその値

変数 res3 を評価した結果を参照するために、また新たな変数 res4 が用意されます。res4 で始まる出力から、設定されたタイトル title=A を確認できます。このとき、2つの変数 res3 および res4 はどちらも、同じウインドーに束縛されます。それが事実なら、

scala> res4.title = "C"

変数 res3 に代えて、変数 res4 を介しても、タイトルを変更できるはずです。変数 res4 に代えて、変数 res3 を介して、その属性値を確認すると、

scala> res3.title
res5: String = C
20131210031803
f:id:shiorichannel:20210222165948p:plain
メソッド呼び出しとリターン値

文字列 "C" が得られます。ここでも、その結果を参照するために、また新たな変数 res5 が用意されます。このとき、単純な文字列と複雑なウインドーとの間に、本質的な違いはありません。どちらも一人前のオブジェクトです。

変数  res5    res0
---------------------------------------------------
型   String  scala.swing.MainFrame
値   C       scala.swing.Frame$$anon$1[frame0,...]

一般に、属性の値を獲得(属性値を参照)するときには、次の書式に従います。
scala> オブジェクト.属性
変数: 型 = 値
変数 res5 の型は文字列 String で、その値は文字列 C です。また、2つの変数 res3 および res4 がどちらも、同じウインドーに束縛される事実は、

scala> res3 == res4
res6: Boolean = true

でも確認できます。ここでも、また新たな変数 res6 が用意され、その型は論理型 Boolean で、その値は真を表わす true だと分ります。文字列と同様に、true もリテラルのひとつで、すでに何度も登場しています。

f:id:shiorichannel:20210222170032p:plain
属性

Created: 2012/12/18|Last updated: 2013/12/10 16:13:34