[ruby-list:50077] Re: def文だけでは邪道でしょうか?
From:
"zeugschl@..." <zeugschl@...>
Date:
2015-02-03 08:15:00 UTC
List:
ruby-list #50077
てらじまと申します > 質問事項は、def文の連続というパターンは、rubyでは何か不自然/邪道なので しょうか?ということです。 先ほどきしもとさんから返信があった通り、Rubyの文法上def文というものはありません。 defはメソッドを定義する時に使用します。 示されている例と > ②def文で、データを読み取ります。 > ③def文で、類似度係数行列を作成します。 > ④def文で、推移性行列を作成します。 > ⑤def文で、類似関係(ファジィ同値関係)を表示します。 を拝見するに、 ご質問にあるdef文というのはメソッド呼び出しのことをさしているのでしょうか? # メソッド定義 def foo(bar) end # メソッド呼び出し foo(some_var) # <- これをdef文と呼んでいる? (違っていたら以下は無視してください) そうだとすると、ご質問の内容は 「(制御構造等を使用せず)単に定義したメソッドの呼び出しの連続で構成されるスクリプトは不自然か?」 ということになるかと思いますが、 そのような作りそれ自体がRubyとして不自然だ、ということはないでしょう。 ただ、メソッド定義の内容によっては「つめこみすぎ」、 (メソッドを呼び出す側からすると「処理を隠しすぎ」) となることもあります。 また、Rubyのオブジェクト指向的側面からは、 類似関係を処理するクラスを作成し、 たとえばCSVファイル名かなにかを受け取ってインスタンス化し、 必要に応じて、欲する形式の行列を取得する、 という作りのほうが自然になるかもしれません。 その場合の大枠は正木さんの返信にあるようなコードになると思います。 # この方針でいく場合「どこにどのように表示するか」は呼び出し側の都合であることが多いので # 実際に表示する部分については類似関係処理クラスに含めない方がいいかもしれません 2015-02-03 15:06 GMT+09:00 Kouichi Akiyama <akansei@r8.dion.ne.jp>: > 初めまして。秋山 好一と申します、よろしくお願いします。 > ruby初心者です。たのしいrubyのはずが、全般的な理解はほとんど出来ていません。 > 配列クラスに関心をもち、エクセルvbaでの経験から、ファジィ数値データ処理 をやり始めました。 > 配列の部分を集中的に学習しました。これが功を奏したのか、たのしいrubyに変 化しつつありますが、この先は自信がありません? > > 質問事項は、def文の連続というパターンは、rubyでは何か不自然/邪道なので しょうか?ということです。 > その他、雑誌等に投稿するときは、ユーザインターフェイス(例えば'Tk'などを 使用して)作成する必要があるのでしょうか? > > 類似関係(ファジィ同値関係)分析の一例を以下に示しておきます。使用した rubyのバージョンは2.0です > window7とUbuntuで、動作を確認しています。 > > ①csv形式で、分析データを作成しておきます。 > ②def文で、データを読み取ります。 > ③def文で、類似度係数行列を作成します。 > ④def文で、推移性行列を作成します。 > ⑤def文で、類似関係(ファジィ同値関係)を表示します。 > > 上記プログラムの概要と実行結果は以下の通りです。 > 項目A,B,C,Dで、(A-C) ,(B-D)がクラスターを形成する例です。 > > # encoding: utf-8 > require "csv" > require "./read-csv.rb" > require "./item-disp.rb" > require "./data-disp.rb" > require "./similar-coeff.rb" > require "./max-trans.rb" > require "./cluster-pat.rb" > #-----------main--------------------------- > puts "csvファイル名を入力してください" > sd = STDIN.gets.chomp mat = read_csv(sd) > puts "読み取ったデータ" > mat = item_disp(mat) mat = data_disp(mat) > puts "類似度係数行列" > mat = item_disp(mat) > mat = similar_coeff(mat) > puts "最大法推移性行列" > mat = item_disp(mat) > mat = max_trans(mat) > puts "パターン識別行列" > mat = cluster_pat(mat) > > > A,B,C,Dのクイズに対して、1は正答、0は誤答と考えてください > 実行結果はつぎの通りです。 > 読み取ったデータ > [A] [B] [C] [D] > 1.00 1.00 1.00 0.00 > 0.00 1.00 0.00 0.00 > 1.00 1.00 1.00 1.00 > 1.00 1.00 0.00 1.00 > 0.00 1.00 0.00 1.00 > 1.00 0.00 1.00 0.00 > 1.00 1.00 1.00 0.00 > 1.00 0.00 1.00 0.00 > 1.00 1.00 0.00 0.00 > 1.00 0.00 1.00 0.00 > > 類似度係数行列 > [A] [B] [C] [D] > 1.00 0.50 0.80 0.30 > 0.50 1.00 0.30 0.60 > 0.80 0.30 1.00 0.30 > 0.30 0.60 0.30 1.00 > > 最大法推移性行列 > [A] [B] [C] [D] > 1.00 0.50 0.80 0.50 > 0.50 1.00 0.50 0.60 > 0.80 0.50 1.00 0.50 > 0.50 0.60 0.50 1.00 > > パターン識別行列 > 1回目 識別レベル 1.00 > [A] [B] [C] [D] > 1 0 0 0 > 0 1 0 0 > 0 0 1 0 > 0 0 0 1 > 2回目 識別レベル 0.80 > [A] [B] [C] [D] > 1 0 1 0 > 0 1 0 0 > 1 0 1 0 > 0 0 0 1 > ["A", "C"] > 3回目 識別レベル 0.60 > [A] [B] [C] [D] > 1 0 1 0 > 0 1 0 1 > 1 0 1 0 > 0 1 0 1 > ["A", "C"] > ["B", "D"] > 4回目 識別レベル 0.50 > [A] [B] [C] [D] > 1 1 1 1 > 1 1 1 1 > 1 1 1 1 > 1 1 1 1 > ["A", "B", "C", "D"] > > >