質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

4回答

2107閲覧

定数は変数の一部なのでしょうか?

tmiyachi

総合スコア47

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2016/05/05 06:06

Swift/Rubyで、定数と変数はべつの概念だと思っていたのですが、定数は変数の種類の1つなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Rubyについてだけ説明します。

プログラミンする上では、特別な変数 (識別子) と思っていれば十分ですが、概念としては別ものです。

正確な定義は Ruby リファレンスを参照しましょう。

...
Ruby の変数と定数の種別は変数名の最初の一文字によって、 ローカル変数、 インスタンス変数、 クラス変数、 グローバル変数、 定数 のいずれかに区別されます。 通常の変数の二文字目以降は英数字または _ですが、組み込み変数の一部には 「`$'+1文字の記号」という変数があります(組み込み変数を参照)。変数名 の長さにはメモリのサイズ以外の制限はありません。
...
アルファベット大文字 ([A-Z]) で始まる識別子は定数です。

定数の定義 (と初期化) は代入によって行われますが、メソッドの 中では定義できません。一度定義された定数に再び代入を行おうと すると警告メッセージが出ます。定義されていない定数にアクセス すると例外 NameError が発生します。
定数はその定数が定義されたクラス/モジュール定義の中(メソッド 本体やネストしたクラス/モジュール定義中を含みます)、クラスを 継承しているクラス、モジュールをインクルードしているクラスま たはモジュールから参照することができます。クラス定義の外(トッ プレベル)で定義された定数は Object に所属することになり ます。

またクラス定義式はクラスオブジェクトの生成を行うと同時に、 名前がクラス名である定数にクラスオブジェクトを代入する動作をします。 クラス名を参照することは文法上は定数を参照していることになります。

親クラスとネストの外側のクラスで同名の定数が定義されているとネストの外 側の定数の方を先に参照します。つまり、定数参照時の定数の探索順序は、最 初にネスト関係を外側に向かって探索し、次に継承関係を上位に向かって探索 します。
...

定数にはもハマりどころが幾つかあります。

...
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 では 次のような話題もあります。

本書ではRailsの定数が自動読み込みおよび再読み込みされる仕組みについて説明します。
...

投稿2016/05/05 09:11

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Swiftは詳しくはありませんので、Rubyについてだけ説明します。

まず変数とはどのように定義しての質問でしょうか。通常、変数といった場合、二つの場合があります。

  1. 区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの
  2. 1.、かつ、その値が状況によって変遷できるもの

文脈や状況、定義によっては1.か2.かは様々です。次に定数ですが、これもまた三つの場合があります。

  1. 区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの
  2. 1.、かつ、その値が状況によって変遷__できない__もの
  3. 何かしらの値を直接表す表現

こちらも文脈や状況、定義によっては1.か2.かは様々です。最後の3.については、Cなどの一部を除いて、リテラルやリテラル定数という表現で区別する場合が多いです。

このように、定義の仕方によっては、「変数⊃定数」の場合もあれば「変数=定数」や「変数∩定数=φ」の場合もあります。

Rubyの規格書JIS X 3017では変数を変数の1.の意味で定義しています。そして、定数を定数の1.の意味で、かつ、クラスまたはモジュール内で定義され、クラスまたはモジュールの内または外からアクセスできる物と定義しています(規格としては、定数が変更できないことを強制しません)。ですので、規格上の用語としては「変数⊃定数」つまり、定数は変数の一部と言えます。

Rubyの日本語リファレンスでは「変数と定数」の一つとして定数を定義しています。文脈的に「変数と定数」を__変数__と省略して表記している所もあるようですが、基本的には一体の物としては書かれているようです。この場合、変数という言葉自体が未定義であり、一部かどうかを決めることはできません。

投稿2016/05/05 08:40

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmiyachi

2016/05/05 08:43

詳細にありがとうございます。 1.区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの で定義した場合、変数⊃定数ということだったのですね。 逆に言うと、 1.区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの に該当しないものは変数ではなく何というのでしょうか?
raccy

2016/05/05 09:22

変数以外のものを総称する言葉は無いと思いますが、例は挙げれます。 たとえば、「キーワード」(classやifなど)は変数でも定数ではありません。キーワード自体になんらかの値を持っていないからです。「構文の一部になる記号」(()や{}など)とかも変数ではありません。
tmiyachi

2016/05/05 09:27

ありがとうございます、すごすぎます。 いまSwiftをやってるのですが、2言語やって初めて分かることや、疑問が出てくることってありますね
guest

0

ベストアンサー

定数と言っても、リテラル(1とか"a"とか)も定数なので、以下ではリテラル以外の定数の話だとします。

言語に依ります。というか、「変数とは何か」の定義次第です。多くの言語では、文法説明上、変数と定数を分けています。異なる概念です。また、定数の存在しない言語もあります(変数の存在しない高級言語は知りません)。

言語に依りますが、宣言の仕方、代入の仕方、再代入したらどうなるか、スコープ(有効範囲)など何らかの違いがあります。

Swiftだと、宣言の仕方も違いますし、再代入するとエラーとなります。

Rubyの場合は、再代入してもエラーにならず警告メッセージだけで、代入が成功して実行が継続するので、定数と変数の区別が弱いと言って良いかと思います(定数に再代入できる言語を他に知りません)。
ただし、スコープが、変数と異なるので、スコープをしっかり押さえる必要はあります。
また、クラス名、モジュール名は定数である必要があるなど、使い方が変数とは異なる部分もあります。

投稿2016/05/05 08:12

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmiyachi

2016/05/05 08:14

ありがとうございます! >多くの言語では、文法説明上、変数と定数を分けています。 こちらで腹落ちできました。
guest

0

Rubyでの定数は、変数とは大きく異なります。

  • まず、「定数」である以上、一度代入したあとにはオブジェクトを差し替えることができません(ただし、配列の要素や文字列の内容など、オブジェクト自体は破壊的に変更可能なこともあります)。
  • Rubyの変数は「グローバル変数」「クラス変数」「インスタンス変数」「ローカル変数」というように分かれていて、頭の記号で区別されますが、定数はグローバル定数かクラス・モジュールに属する定数しかなく、「大文字で始まる」ということで変数から区別されます。
  • クラスやモジュールも大文字から始まりますが、これらもClassModuleクラスの定数です。クラスの宣言文がそのまま定数宣言となっています。

Swiftについてはわからないので他の回答者に譲ります。

投稿2016/05/05 07:00

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmiyachi

2016/05/05 07:02

ありがとうございます! 変数という概念の中に、定数があるということはない、という理解でよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問