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

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

ただいまの
回答率

90.49%

  • Ruby

    7921questions

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

  • Swift

    7460questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 552

tmiyachi

score 41

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/05 17:14

    ありがとうございます!

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/05 16:02

    ありがとうございます!

    変数という概念の中に、定数があるということはない、という理解でよろしいでしょうか?

    キャンセル

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 17:43

    詳細にありがとうございます。

    1.区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの
    で定義した場合、変数⊃定数ということだったのですね。

    逆に言うと、

    1.区別可能な識別子を持ち、何らかの値(=データ=オブジェクト)と結びつけられるもの

    に該当しないものは変数ではなく何というのでしょうか?

    キャンセル

  • 2016/05/05 18:22

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

    キャンセル

  • 2016/05/05 18:27

    ありがとうございます、すごすぎます。

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

    キャンセル

0

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

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

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

...
Ruby の変数と定数の種別は変数名の最初の一文字によって、 ローカル変数、 インスタンス変数、 クラス変数、 グローバル変数、 定数 のいずれかに区別されます。 通常の変数の二文字目以降は英数字または _ですが、組み込み変数の一部には 「`$'+1文字の記号」という変数があります(組み込み変数を参照)。変数名 の長さにはメモリのサイズ以外の制限はありません。 ... アルファベット大文字 ([A-Z]) で始まる識別子は定数です。  定数の定義 (と初期化) は代入によって行われますが、メソッドの 中では定義できません。一度定義された定数に再び代入を行おうと すると警告メッセージが出ます。定義されていない定数にアクセス すると例外 NameError が発生します。 定数はその定数が定義されたクラス/モジュール定義の中(メソッド 本体やネストしたクラス/モジュール定義中を含みます)、クラスを 継承しているクラス、モジュールをインクルードしているクラスま たはモジュールから参照することができます。クラス定義の外(トッ プレベル)で定義された定数は Object に所属することになり ます。 またクラス定義式はクラスオブジェクトの生成を行うと同時に、 名前がクラス名である定数にクラスオブジェクトを代入する動作をします。 クラス名を参照することは文法上は定数を参照していることになります。 親クラスとネストの外側のクラスで同名の定数が定義されているとネストの外 側の定数の方を先に参照します。つまり、定数参照時の定数の探索順序は、最 初にネスト関係を外側に向かって探索し、次に継承関係を上位に向かって探索 します。 ...

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

... Rubyにおける定数は意図せず書き換えられることがある ... コレクションの場合、要素もfreezeするべき ... 再代入も不可にさせたい場合、moduleをfreezeする ...

↑では、こんな例が示されています。

PERMIT_ID = ['0001', '0002', '1234']
PERMIT_ID.reject! { |id| id == '1234' }
p PERMIT_ID
# => ["0001", "0002"]
PERMIT_ID = ['0001', '0002', '1234'].map(&:freeze).freeze
p PERMIT_ID
# => ["0001", "0002", "1234"]
PERMIT_ID = 'hogefuga'
# => warning: already initialized constant PERMIT_ID
# => warning: previous definition of PERMIT_ID was here
p PERMIT_ID
# => "hogefuga"

rails では 次のような話題もあります。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    7921questions

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

  • Swift

    7460questions

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

閲覧数の多いRubyの質問