none
新しい変数の名前を変数で宣言するには RRS feed

  • 質問

  • 新しい変数を宣言するとき、その変数名をもともとある変数の値で宣言できませんか

    たとえば、

    dim a as string = "test"
    dim [a] as string
    つまり2つ目に宣言する変数の名前をtestにしたいのですが、[a]のところはなんと記述すればいいのでしょうか。

    2013年6月22日 8:02

回答

  •  それで、 a の内容が変わったら、どうするんですか?

     Dictionary を使うなどすれば、まぁ、似たようなことはできます。


    Jitta@わんくま同盟

    • 回答の候補に設定 星 睦美 2013年6月24日 8:22
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 13:43
  • つまり2つ目に宣言する変数の名前をtestにしたいのですが、[a]のところはなんと記述すればいいのでしょうか。

    無理でしょう。代替として、Jittaさんが書かれているようにDictionaryを使う他に、ExpandoObjectオブジェクトを使ってもそれっぽいことができると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年6月24日 8:23
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 14:45
    モデレータ
  • shocho0101 さま よろしく。

    一生懸命調べたのですが、やはり、難しいですね。
    VB って中間言語経由のイメージ (個人的に) なので、変数名を置換できればいいんですけどね ... 駄目です。

    皆さんがお書きのように Dictionary や List(Of String) 等で逃げられますけど ... 。
    実際の問題では、変数値が何回も変わったり幾つも作られたりするのでは。
    重複宣言の問題や予約語とのバッティングなんかも考えられます。

    質問なさるため、問題を簡略化なさったと思うのですが、
    もう少し、具体的にやりたい事を明示なさっては如何ですか。

    • 編集済み ShiroYuki_Mot 2013年6月22日 15:25 List(Of String) 追加
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 15:16
  • 一生懸命調べたのですが、やはり、難しいですね。

     すみません、「調べた」ということは、「できるかもしれない」と思われた、ということですよね?どのようにしたらできるだろうと思われて、どのようなものを、どのように調べてみられたのでしょうか。

     変数とは、内容を記録するためのメモリ位置を人間が記憶するためのものです。変数の内容が決まるのは、実行時です。変数の「名前」が必要なのは、コンパイル時です。「記録位置を人間がわかりやすいようにする」という目的を満足するために必要なときが「コンパイルまで」なので、コンパイル後に決まる名前を元にした記録はできない、と結論づけているので、調べてみようとも思いませんでした。

     実現したいことと、質問のために用いた例が異なっていることは、よくありますね。たとえば、「仕様書の中の言葉で変数の宣言がしたい。しかし、仕様書で用いる用語がまだ決まっていないので、後で変わったときに対応したい」ということが考えられますね。
     この場合は、プリプロセッサを自作したり、IDE 等のリファクタリング機能を利用することができます。


    Jitta@わんくま同盟

    • 回答としてマーク shocho0101 2013年6月25日 10:37
    2013年6月23日 5:50
  • Jitta さま ご指摘ありがとうございます。

    最初の 3 行は余計ですね。 無知をひけらかしてしまいました。
    お許し下さい。

    経緯は、以前使っていた言語が、中間コードにコンパイルする(インタープリータ)タイプのもので、変数名も置換が可能でした。
    VB を使っていて、そんな必要も無く過ごしていましたが、もしやと思い調べた訳です。

    仰られる様に、実行時に変数値が変わる事も想定されたので、無駄な調べものかなぁという印象を持って調べていました。
    質問者さんが、もし、同じ様な発想でご質問になったのなら という気持ちが、先の 3 行を書いた理由です。

    すみません。 ありがとうございました。

    • 回答としてマーク shocho0101 2013年6月25日 10:38
    2013年6月23日 8:02
  • 話題が脱線気味ですが、コメントします。

    eval(コードの実行時評価)のある言語では普通なことだと思います。eval "変数名" とされたら、その値を取り出せる必要がありますから。実行時に変数名でアクセスすることは、その変数が定義されているスコープを1つのハッシュ(.NETではDictionary)に見立てて、ハッシュアクセスすることと同等です。

    ただし、VBには実行時に変数名でアクセスするようなことはなく、必要であればDictionaryを用意し、そこにアクセスすることになっています。(これがJittaさんの最初の回答。)

    2013年6月24日 11:18

すべての返信

  • Dim a As String = "test"
    Dim test As String = a

    2013年6月22日 13:29
  •  それで、 a の内容が変わったら、どうするんですか?

     Dictionary を使うなどすれば、まぁ、似たようなことはできます。


    Jitta@わんくま同盟

    • 回答の候補に設定 星 睦美 2013年6月24日 8:22
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 13:43
  • つまり2つ目に宣言する変数の名前をtestにしたいのですが、[a]のところはなんと記述すればいいのでしょうか。

    無理でしょう。代替として、Jittaさんが書かれているようにDictionaryを使う他に、ExpandoObjectオブジェクトを使ってもそれっぽいことができると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年6月24日 8:23
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 14:45
    モデレータ
  • shocho0101 さま よろしく。

    一生懸命調べたのですが、やはり、難しいですね。
    VB って中間言語経由のイメージ (個人的に) なので、変数名を置換できればいいんですけどね ... 駄目です。

    皆さんがお書きのように Dictionary や List(Of String) 等で逃げられますけど ... 。
    実際の問題では、変数値が何回も変わったり幾つも作られたりするのでは。
    重複宣言の問題や予約語とのバッティングなんかも考えられます。

    質問なさるため、問題を簡略化なさったと思うのですが、
    もう少し、具体的にやりたい事を明示なさっては如何ですか。

    • 編集済み ShiroYuki_Mot 2013年6月22日 15:25 List(Of String) 追加
    • 回答としてマーク shocho0101 2013年6月25日 10:36
    2013年6月22日 15:16
  • 一生懸命調べたのですが、やはり、難しいですね。

     すみません、「調べた」ということは、「できるかもしれない」と思われた、ということですよね?どのようにしたらできるだろうと思われて、どのようなものを、どのように調べてみられたのでしょうか。

     変数とは、内容を記録するためのメモリ位置を人間が記憶するためのものです。変数の内容が決まるのは、実行時です。変数の「名前」が必要なのは、コンパイル時です。「記録位置を人間がわかりやすいようにする」という目的を満足するために必要なときが「コンパイルまで」なので、コンパイル後に決まる名前を元にした記録はできない、と結論づけているので、調べてみようとも思いませんでした。

     実現したいことと、質問のために用いた例が異なっていることは、よくありますね。たとえば、「仕様書の中の言葉で変数の宣言がしたい。しかし、仕様書で用いる用語がまだ決まっていないので、後で変わったときに対応したい」ということが考えられますね。
     この場合は、プリプロセッサを自作したり、IDE 等のリファクタリング機能を利用することができます。


    Jitta@わんくま同盟

    • 回答としてマーク shocho0101 2013年6月25日 10:37
    2013年6月23日 5:50
  • Jitta さま ご指摘ありがとうございます。

    最初の 3 行は余計ですね。 無知をひけらかしてしまいました。
    お許し下さい。

    経緯は、以前使っていた言語が、中間コードにコンパイルする(インタープリータ)タイプのもので、変数名も置換が可能でした。
    VB を使っていて、そんな必要も無く過ごしていましたが、もしやと思い調べた訳です。

    仰られる様に、実行時に変数値が変わる事も想定されたので、無駄な調べものかなぁという印象を持って調べていました。
    質問者さんが、もし、同じ様な発想でご質問になったのなら という気持ちが、先の 3 行を書いた理由です。

    すみません。 ありがとうございました。

    • 回答としてマーク shocho0101 2013年6月25日 10:38
    2013年6月23日 8:02
  • 私は「中間コードにコンパイルする(インタープリータ)タイプのもので、変数名も置換が可能」な言語、の存在を知りませんでした。その点で、ShiroYuki_Motさんには、発想の始発点が広いというアドバンテージがあると思います。「VB を使っていて、そんな必要も無く過ごしていました」ということは、そういう必要がある言語を使い、開発を行っていたということですよね。経験は、大きな財産です。許す/許さないという話ではないと思います。

    Jitta@わんくま同盟

    2013年6月23日 14:03
  • フォーラム オペレーターの星 睦美です。
    shocho0101 さん、こんにちは。

    残念ながら新しい変数の名前を変数で宣言することは、質問の方法では難しいようです。
    Jitta さんとtrapemiya さんの返信を[回答の候補に設定] させていただきました。
    フォーラムでの回答には、投稿者から[回答としてマーク]いただければ幸いです。

    では、これからもMSDN フォーラムをお役立てください。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年6月24日 8:31
  • 話題が脱線気味ですが、コメントします。

    eval(コードの実行時評価)のある言語では普通なことだと思います。eval "変数名" とされたら、その値を取り出せる必要がありますから。実行時に変数名でアクセスすることは、その変数が定義されているスコープを1つのハッシュ(.NETではDictionary)に見立てて、ハッシュアクセスすることと同等です。

    ただし、VBには実行時に変数名でアクセスするようなことはなく、必要であればDictionaryを用意し、そこにアクセスすることになっています。(これがJittaさんの最初の回答。)

    2013年6月24日 11:18