• ベストアンサー
  • 困ってます

Ruby 文法 ブロックの中で自クラスの定数を呼ぶ

  • 質問No.8509723
  • 閲覧数107
  • ありがとう数13
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 43% (35/81)

以前した質問(http://okwave.jp/qa/q8484921.html)と非常に似てる質問になります。
以前の質問ではブロックの中で、そのクラスのメソッドを呼ぶ時のことでしたが、今回はメソッドではなく、定数にアクセスする時の質問です。

class Hoge
VAL=1

def piyo
yield
end
end

h=Hoge.new
h.piyo do |this|
puts Hoge::VAL #<ーココの話
end

上の様に書く時、ブロックの中で、そのクラスの中の定数を参照するとき、上の例だと
Hoge::VAL
と書いてますが、Hoge::と書くのがとても嫌なので、以下の様に書いてみました。
class Hoge
VAL=1

def piyo
yield self
end

def retVal
VAL
end
end

h=Hoge.new
h.piyo do |this|
puts this.retVal #<-Hoge::VALと書かなくてよくなった。
end

が、しかし実はVALなどの定数は多数あり、その数の分だけ値を返すメソッドを書くなんて、もっと嫌です。

なんか良い書き方はあるのでしょうか?

以下、蛇足なのですが、そもそもクラスの中でしかアクセスしないマジックナンバー的な定数の定義の仕方が間違っているのでしょうか? moduleに定義して、クラスの中とブロック使うところでincludeするなどの方がスッキリするのかも。。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 58% (42/72)

クラス変数を使う方法に変更すれば、
active_support の cattr_(reader, writer, accessor)
が使えるかなと思います。
gem install active_support

#!/usr/local/bin/ruby
# coding: utf-8
require 'active_support/core_ext'
class Hoge
cattr_reader :val1, :val2, :val3
@@val1 = 1
@@val2 = 2
@@val3 = 3
def piyo
yield self
end
end
Hoge.new.piyo {|t| p t.val1, t.val2, t.val3 }
お礼コメント
nomorevup

お礼率 43% (35/81)

MillenniuMさん、ご回答ありがとうございました。

active_support知りませんでした。
投稿日時:2014/03/12 15:03
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ