こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

以前した質問(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するなどの方がスッキリするのかも。。

投稿日時 - 2014-03-11 20:32:34

QNo.8509723

困ってます

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

クラス変数を使う方法に変更すれば、
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 }

投稿日時 - 2014-03-11 23:32:23

お礼

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

active_support知りませんでした。

投稿日時 - 2014-03-12 15:03:54

このQ&Aは役に立ちましたか?

12人が「このQ&Aが役に立った」と投票しています

回答(1)