Swift/Rubyで、定数と変数はべつの概念だと思っていたのですが、定数は変数の種類の1つなのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
Rubyについてだけ説明します。
プログラミンする上では、特別な変数 (識別子) と思っていれば十分ですが、概念としては別ものです。
正確な定義は Ruby リファレンスを参照しましょう。
...
Ruby の変数と定数の種別は変数名の最初の一文字によって、 ローカル変数、 インスタンス変数、 クラス変数、 グローバル変数、 定数 のいずれかに区別されます。 通常の変数の二文字目以降は英数字または _ですが、組み込み変数の一部には 「`$'+1文字の記号」という変数があります(組み込み変数を参照)。変数名 の長さにはメモリのサイズ以外の制限はありません。
...
アルファベット大文字 ([A-Z]) で始まる識別子は定数です。定数の定義 (と初期化) は代入によって行われますが、メソッドの 中では定義できません。一度定義された定数に再び代入を行おうと すると警告メッセージが出ます。定義されていない定数にアクセス すると例外 NameError が発生します。
定数はその定数が定義されたクラス/モジュール定義の中(メソッド 本体やネストしたクラス/モジュール定義中を含みます)、クラスを 継承しているクラス、モジュールをインクルードしているクラスま たはモジュールから参照することができます。クラス定義の外(トッ プレベル)で定義された定数は Object に所属することになり ます。またクラス定義式はクラスオブジェクトの生成を行うと同時に、 名前がクラス名である定数にクラスオブジェクトを代入する動作をします。 クラス名を参照することは文法上は定数を参照していることになります。
親クラスとネストの外側のクラスで同名の定数が定義されているとネストの外 側の定数の方を先に参照します。つまり、定数参照時の定数の探索順序は、最 初にネスト関係を外側に向かって探索し、次に継承関係を上位に向かって探索 します。
...
定数にはもハマりどころが幾つかあります。
- Rubyで定数を扱う場合はfreezeするべき http://qiita.com/yukiyan/items/39f945c55b6dc5e11ed7
...
Rubyにおける定数は意図せず書き換えられることがある
...
コレクションの場合、要素もfreezeするべき
...
再代入も不可にさせたい場合、moduleをfreezeする
...
↑では、こんな例が示されています。
ruby
1PERMIT_ID = ['0001', '0002', '1234'] 2PERMIT_ID.reject! { |id| id == '1234' } 3p PERMIT_ID 4# => ["0001", "0002"]
ruby
1PERMIT_ID = ['0001', '0002', '1234'].map(&:freeze).freeze 2p PERMIT_ID 3# => ["0001", "0002", "1234"] 4PERMIT_ID = 'hogefuga' 5# => warning: already initialized constant PERMIT_ID 6# => warning: previous definition of PERMIT_ID was here 7p PERMIT_ID 8# => "hogefuga"
rails では 次のような話題もあります。
- 定数の自動読み込みと再読み込み http://railsguides.jp/constant_autoloading_and_reloading.html
本書ではRailsの定数が自動読み込みおよび再読み込みされる仕組みについて説明します。
...
投稿2016/05/05 09:11
総合スコア22324
0
Swiftは詳しくはありませんので、Rubyについてだけ説明します。
まず変数とはどのように定義しての質問でしょうか。通常、変数といった場合、二つの場合があります。
- 区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの
- 1.、かつ、その値が状況によって変遷できるもの
文脈や状況、定義によっては1.か2.かは様々です。次に定数ですが、これもまた三つの場合があります。
- 区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの
- 1.、かつ、その値が状況によって変遷__できない__もの
- 何かしらの値を直接表す表現
こちらも文脈や状況、定義によっては1.か2.かは様々です。最後の3.については、Cなどの一部を除いて、リテラルやリテラル定数という表現で区別する場合が多いです。
このように、定義の仕方によっては、「変数⊃定数」の場合もあれば「変数=定数」や「変数∩定数=φ」の場合もあります。
Rubyの規格書JIS X 3017では変数を変数の1.の意味で定義しています。そして、定数を定数の1.の意味で、かつ、クラスまたはモジュール内で定義され、クラスまたはモジュールの内または外からアクセスできる物と定義しています(規格としては、定数が変更できないことを強制しません)。ですので、規格上の用語としては「変数⊃定数」つまり、定数は変数の一部と言えます。
Rubyの日本語リファレンスでは「変数と定数」の一つとして定数を定義しています。文脈的に「変数と定数」を__変数__と省略して表記している所もあるようですが、基本的には一体の物としては書かれているようです。この場合、変数という言葉自体が未定義であり、一部かどうかを決めることはできません。
投稿2016/05/05 08:40
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/05 09:22
2016/05/05 09:27
0
ベストアンサー
定数と言っても、リテラル(1とか"a"とか)も定数なので、以下ではリテラル以外の定数の話だとします。
言語に依ります。というか、「変数とは何か」の定義次第です。多くの言語では、文法説明上、変数と定数を分けています。異なる概念です。また、定数の存在しない言語もあります(変数の存在しない高級言語は知りません)。
言語に依りますが、宣言の仕方、代入の仕方、再代入したらどうなるか、スコープ(有効範囲)など何らかの違いがあります。
Swiftだと、宣言の仕方も違いますし、再代入するとエラーとなります。
Rubyの場合は、再代入してもエラーにならず警告メッセージだけで、代入が成功して実行が継続するので、定数と変数の区別が弱いと言って良いかと思います(定数に再代入できる言語を他に知りません)。
ただし、スコープが、変数と異なるので、スコープをしっかり押さえる必要はあります。
また、クラス名、モジュール名は定数である必要があるなど、使い方が変数とは異なる部分もあります。
投稿2016/05/05 08:12
総合スコア84499
0
Rubyでの定数は、変数とは大きく異なります。
- まず、「定数」である以上、一度代入したあとにはオブジェクトを差し替えることができません(ただし、配列の要素や文字列の内容など、オブジェクト自体は破壊的に変更可能なこともあります)。
- Rubyの変数は「グローバル変数」「クラス変数」「インスタンス変数」「ローカル変数」というように分かれていて、頭の記号で区別されますが、定数はグローバル定数かクラス・モジュールに属する定数しかなく、「大文字で始まる」ということで変数から区別されます。
- クラスやモジュールも大文字から始まりますが、これらも
Class
やModule
クラスの定数です。クラスの宣言文がそのまま定数宣言となっています。
Swiftについてはわからないので他の回答者に譲ります。
投稿2016/05/05 07:00
総合スコア145183
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。