• 締切済み

インスタンス変数の値の保持に関して

お世話になります。現在Rubyのプログラムを生成しております。 CSVを出力加工するプログラムで、処理の流れは以下のとおりです。 1) 処理対象となるCSVファイルより、値を1つずつ取り出す  records = Array.new(1)  test_field_1 = PARAMETER.new(records[1].to_s)  test_field_2 = PARAMETER.new(records[2].to_s)  ...  ... 2) initializeメソッドへ渡し、インスタンス変数「@parameter」   へ上書きし渡す。   def initialize(p)     @parameter = p   end 3) 出力時に(オブジェクト名.メソッド名)にて、メソッド処理を   行う。   printf(test_field_1.TEST_FIELD_1)   printf(test_field_2.TEST_FIELD_2)  ...  ... 概ねの処理は、これで解決できるのですが、一箇所だけ前パラメータ 値を保持させたまま、次のパラメータを処理させたいのです。 具体的に申し上げますと、 1) test_field_100 = PARAMETER.new(records[100].to_i)   def TEST_FIELD_100     @parameter = @parameter / 100   end  ⇒ ここの@parameterの値を保持したまま、次のメソッドの処理を    行いたいのです。 うまいプログラムの書き方があれば、ご教示頂ければ助かります。 よろしくお願いいたします。

  • Ruby
  • 回答数1
  • ありがとう数2

みんなの回答

  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.1

なんとか文章の意味を取ろうと試みましたが無理そうです。 ・「概ねの処理は」以前の文章は質問を理解するのに必要でしょうか? 必要ないという前提で、 ・「前パラメータ」「次のパラメータ」の前、次というのは何?  繰り返しのN回目とN+1回目という意味ですか? そうだとして、 繰り返しの中で更新される変数の、前回の値を使いたいなら、 更新する前に別の変数にセットしておけばいいです。

関連するQ&A

  • 配列内の変数の保持と、引数とインスタンス変数の使い

    配列内の変数の保持と、引数とインスタンス変数の使いわけについて class Test def main max_day = 3 p find_required_day(max_day) end def find_required_day(max_day) today = Time.now.day (1..max_day).each do |day| @day = day @today_equal_required_day = day == 3 break if @today_equal_required_day end return required_day = @today_equal_required_day ? @day : today end end test = Test.new test.main 配列の変数を、ループ終了後にするには上のようにインスタンス変数にするの が一般的なのでしょうか。 個人的には、一つのメソッド内でしか使わない変数は、ローカル変数にしない のはちょっと違和感があるのですが。 また上のように、上位のメソッドから下位のメソッドに変数を渡す場合、イン スタンス変数にするか、引数にするのはどちらがいいのでしょうか。 以上2点よろしくお願いします。m(_ _)m *これは質問用に簡易にかいたので、find_required_day(3)にすればいい。と いうような、この質問事項のみにしか適応できないご回答はご遠慮お願いします。

    • ベストアンサー
    • Ruby
  • Ruby インスタンスの初期化について

    newメソッドを使わずにinitializeメソッドを定義しただけで インスタンスが作成されて初期化までされる理屈について 教えていただけないでしょうか? またクラスを作るときに基となっているObjectクラスとは一体 何物なのか、教えて頂きたい。 例 01:#Sampleクラスを作る 02:class Sample 03: #Samlpeクラスのインスタンスを初期化 04: def imitialize( lv, hp ) 05: end 06:end ↑の場合インスタンスlvとhpは、「lv = sample.new( 0 )」などと言う ように定義されてない。 それにnewメソッドでインスタンスを作りそこに数値の0を代入できるなら そもそもinitializeで初期化する必要は無いのではないでしょうか? 有識者の方いらっしゃいましたら、ご説明をよろしくお願いします。

    • ベストアンサー
    • Ruby
  • 演算子の再定義とインスタンス変数の参照と代入

    list9.1とlist 9.3をあわせた二次元の座標、xとyを持つ プログラムです class Point attr_reader :x, :y def initialize(x=0, y=0) @x, @y = x, y end def inspect # 表示用 "(#{x}, #{y})" end def +(other) # x、yのそれぞれを足す self.class.new(x + other.x, y + other.y) end def -(other) # x、yのそれぞれを引く self.class.new(x - other.x, y - other.y) end def [](index) case index when 0 x when 1 y else raise ArgumentError, "out of range `#{index}'" end end def []=(index, val) case index when 0 self.x = val when 1 self.y = val else raise ArgumentError, "out of range `#{index}'" end end end point = Point.new(3, 6) p point[0] #=> 3 p point[1] = 2 #=> 2 p point[1] #=> 2 p point[2] #=>エラー(ArgumentError) についてお尋ねしたいのですが、 def [](index)で演算子を再定義する際、値を参照する方法で def [](index)  case index  when 0   x   : と、していますが、xp.135のアクセサの説明など では@xと「@」が要りそうな感じがするのですが、この 場合は省いて大丈夫なんでしょうか? プログラムがローカル変数と間違って処理したりという ことは無いんでしょうか。 仮にないとすれば、ここのcase文にはインスタンス変数 と同じ名前のローカル変数などは定義できないのでしょうか? ご教授願います。

    • ベストアンサー
    • Ruby
  • 値の保持

    図書管理システムをPHPで作っております。 本の検索結果をページングで2件ずつなどで表示しております。 そこで、貸出可能の場合チェックボックスを表示し、 1ページ目でいくつかチェックし、 次ページの検索結果に行き、またチェックボックスを チェックし、最終的には前にチェックした値と合わせて 一括貸出処理を行いたいと思っております。 セッションを使ったり、 <a href=test.php?page=1&value=値1,値2・・・など>で チェックした値を保持しようと思い、検索してみたのですが いいのが見つかりませんでした。 具体的な方法があれば教えてください。 初心者のため、文章に分かりづらい点や意味不明な部分 があるかと思いますが 何卒宜しくお願い致します。 スタイルですが、 submitボタンは 貸出ボタンしか使用しないため、 チェックボックスの値をチェックした時点で 値を取得でき、それを保持したまま次ページで もチェックした値を加えていければと思います。

    • ベストアンサー
    • PHP
  • PHPで値を保持する方法

    PHPで、リクエストをまたいで値を保持する方法を教えてください。というかサーバー起動時に1回処理をし、その情報を使い続ける方法といった方が適切かもしれません。「リクエストをまたいで」といってしまうと、反射的に「セッションに保存」といいたくなると思いますが、そういう話ではありません。 画面上に検索条件でSELECTリストを表示します。この情報を今は、画面表示のたびに毎回DBにアクセスしデータを取得しています。 しかしサーバーが起動している間程度の期間ではめったに変更することはない値なので、リクエストのたびにDBにとりに行くのがあまりにも無駄なので、これをやめたいと思っています。かといって年に何回かは変更があってもおかしくない値なので、そのたびにプログラムを変更するのではなく、あくまでもDBのデータの変更だけで済ませたいと思っています。 つまり、リクエストのたびにDBにとりに行くのではなく、PHPのプログラムファイルにハードコーディングするのでもなく、Webサーバーが起動したときに1回だけDBから読み込み、変数に保持しておき何度も使いまわしたいと思っています。 で、ためしにclassのstatic変数に値を設定してみたのですが、リクエストのたびに値が初期化されてしまいました。$GLOBALSに値を設定してもリクエストのたびに値が初期化されてしまいました。 Javaなどの言語では、当たり前に行う処理ですがPHPで実現する方法が分かりません。 PHPで、リクエストをまたいで値を保持する方法を教えてください。 もしかするとPHPでは、値を保持することはできないのでしょうか? もしそうだとすると、PHPでは同じ値をDBから何度も取得するケースではどのように対処しているのでしょうか?(DBのキャッシュ機能頼み?そもそもPHPは小規模しか扱わないから気にしない?) この点について教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Rubyのクラス

    class Test def initialize @ary = Array.new(size){false} end def print _print end def _print print"#{@ary}" end end test = Test.new(5) test.print 上記のプログラムはエラーが出て実行できません。期待している動作は[false,false,false,false,false]です。どうしてエラーが出るか教えていただきたいです。また、解決策もよろしくお願いします。

    • ベストアンサー
    • Ruby
  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Javascriptグローバル変数の値引き継ぎ

    Javascriptで関数関係なしに処理した値を引き継ぎたいのですが 可能でしょうか? 例: test = 0; //引き継ぎたい変数 function hoge(){ //処理  a = function(){ //処理 test = 1;  } } hoge; alert(test); //「1」にしたい(関数内で処理した値を保持したい)

  • 子インスタンスを登録するメソッドの作成

    Java初心者です。 学習中に躓いてしまったので、ご教示いただければと思います。 Testという1つのクラスを作成し、 そこから複数のインスタンスを作成します。 Test test1 = new Test(); Test test2 = new Test(); Test test3 = new Test(); 元のTestクラスの中に、 public void addSub(Test child) という、引数に指定したインスタンスを子に登録するメソッドを用意します。 実際に使うときは、 test1.addSub(test2); とすれば、test1の子にtest2が登録されるようにしたいのです。 基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。 このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。 質問の方法が曖昧で分かりにくいと思いますが、 指示いただければ追記いたしますので、 お時間のある方お力を貸していただければと思います。 宜しくお願いします。

    • ベストアンサー
    • Java
  • 親と子メソッドで変数を共有する場合の変数について

    以下のように、親メソッドからwrite_on_spreadsheetから子メソッド( copy_formatting_to_specified_rows)に変数を引き渡す場合、 関数の引数として渡すべきか、インスタンス変数にして引き渡すべきかどっちがいいのでしょうか。 理由とともに教えて下さい。 なお、プログラムは質問用に書いたものでテストはしていないので、細かいミスはお見逃し下さい。m(__)m 個人的にそれぞれのデメリットは 引数・・・メリット/デメリット スコープ範囲が限定されるので、バグ混入を防げる。/引数が場合によっては4つや5つになってしまい、記述が煩雑になる。 インスタンス変数・・・記述がシンプル/変数のスコープ範囲がメソッドの外にに及んでしまう。 なお、ここで使ってるとgemは、グーグルスプレッドシートのレンジ(行、列)に値を入れたりするVBA的なものです。 require google-drive class Spreadsheet def write_on_spreadsheet(max_row, num)  #グーグルスプレッドシートに書き込みます。 (1..max_row).each do |row | spreadsheet(row, 1) = num if spreadseet(rowl, 1) == “100” #特定の行には、セル(1,5)のフォーマットをコピーします。 copy_formatting_to_specified_rows(max_row,row,num) get_days( break end end end def copy_formatting_to_specified_rows(max_row,num) (row..max_row).each do |row| ~略~ end end def get_days ~略~ end end sh = Spreadsheet.new sh.write_on_spreadsheet(230,15)

    • ベストアンサー
    • Ruby