fc2ブログ

2024.11 «  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - » 2025.01
TOP > CATEGORY > Rubyの文法

TOP | NEXT

メソッド名を呼ぶときにメソッド名の前に付けるのはピリオドなのかコロンコロンなのか 

2009年09月10日 ()
rubyのメソッド名をコールする際に、メソッド名の前にピリオド(.)を付けるのか、コロンコロン(::)を付けるのか、訳が分からなかったので実験をしてみました( @ ruby1.8.7 )

結論。

メソッド名の1文字目が小文字の場合はピリオドとコロンコロンのどちらでもよい。
メソッド名の1文字目が大文字の場合は複雑なルール。基本ピリオドにしとけ。そうするとコロンコロンのクラススコープの定数呼び出しから区別し易い。



以下実験結果をほとんど解説なしで書いてみます。

# メソッド
class Nikuman
    def my_name # その1
    #def self.my_name # その2
    #def Nikuman.my_name # その3
    #def Nikuman::my_name # その4
        puts "肉まん"
    end
end

niku = Nikuman.new



# クラススコープの変数
class Nikuman
    my_name = "肉まん" # その5・クラススコープの変数
end

niku = Nikuman.new



■メソッド名の1文字目が小文字(上記の例だと「my_name」の部分)
○:エラーが出なくて「肉まん」と表示された
×:エラーが出た

その1その2その3その4その5
Nikuman::my_name××
Nikuman::my_name()××
Nikuman.my_name××
Nikuman.my_name()××
niku::my_name××××
niku::my_name()××××
niku.my_name××××
niku.my_name()××××



■メソッド名の1文字目が大文字(上記の例だと「my_name」を「MyName」と書き換えた場合)
○:エラーが出なくて「肉まん」と表示された
×:エラーが出た

その1その2その3その4その5
Nikuman::MyName××××
Nikuman::MyName()××
Nikuman.MyName××
Nikuman.MyName()××
niku::MyName×××××
niku::MyName()××××
niku.MyName××××
niku.MyName()××××


【広告】

[2009.09.10(Thu) 09:29] Rubyの文法Trackback(0) | Comments(2) 見る▼
↑TOPへ


COMMENT

ちょっと違うような by takahashim
「クラス定数」というのは、間違いです。Rubyには「クラス定数」という、通常の定数とは違う何かがあったりすることはありません。「その5」の例はNikumanクラスのクラススコープでローカル変数を定義しているだけです。

Nikuman::nameとかNikuman.nameとかは、Nikumanクラスの中でdef nameしない限り、もともとClassクラスのnameメソッドが呼ばれているはずです。

とりいそぎ。

全然違っててすみません by 自分
takamashim さんお久しぶりです。そしてご指摘ありがとうございます。
すっかりnameメソッドが継承元クラスにあることを忘れてましたorz
ですので、nameメソッドの箇所をmy_nameメソッドに書き換えて、よりポイントを絞って書いてみました。
そして、クラス定数というのを改め、クラススコープの定数やらクラススコープの変数やらに書き換えました。

大変勉強になります。

ところでhatenaでご紹介の「ふつうのコンパイラをつくろう」本はとても面白そうですね。目次を見るだけでwktkします。

コメントを閉じる▲

ひらがなの「あ」と表示する6つの方法 

2009年09月04日 ()
ひらがな1文字って言ったってバイトに分解してみれば、そりゃあいろいろ取り出せまっせ。

ひらがなの「あ」をバイト列を使って表示する方法が色々あるので、載せておきます。

# 以下の例は UTF-8 です

# その壱:ノーマル
puts "あ"

# その弐:符号あり10進数
puts [-29, -127, -126].pack("c*")

# その参:符号なし10進数
puts [227, 129, 130].pack("C*")

# その四:8進数
puts "\343\201\202"

# その伍,その六:16進数
puts ["e38182"].pack("H*")
puts "\xe3\x81\x82"

# ちなみにEUC-JP
puts "\xa4\xa2"

# ちなみにShift_JIS
puts "\x82\xa0"



【広告】

[2009.09.04(Fri) 01:08] Rubyの文法Trackback(0) | Comments(0) 見る▼
↑TOPへ

Rubyでカーソルを勝手に動かして文字を上書きしてみる 

2009年08月27日 ()
MATZさんの本の読書感想文は、あまり一般の人が興味がなさそうだったので、いっそのことやめて、読書中に気に留めたことについての記事を書くことにしました。

今日は、カーソルを自由自在に動かせるような Ruby の記述があったので、実験してみました。

つまるところ以下のように書けば、カーソルが動くらしいのです。スゴイ。

# 上に動かす
printf "\e[nA"
STDOUT.flush

# 下に動かす
printf "\e[nB"
STDOUT.flush

# 右に動かす
printf "\e[nC"
STDOUT.flush

# 左に動かす
printf "\e[nD"
STDOUT.flush




と言うわけで、以下にお絵かきサンプルプログラムを載せてみました。
unix系専用ですが。windowsでは動きません(たぶん)。
コピペしたファイルをrubyコマンドで実行するだけで使えるので試してみてください!

class Pixel
  def initialize
    @sleep_time = 0.05
  end

  def left
    move_cursor("D")
  end

  def right
    move_cursor("C")
  end

  def up
    move_cursor("A")
  end

  def down
    move_cursor("B")
  end

  def clear
    printf "\e[2J"
  end

  def draw_pixel
    printf "#"
    STDOUT.flush
    sleep @sleep_time
  end

  def draw_background(x, y)
    self.clear
    background_line = ''
    x.times { background_line += '.' }
    y.times { puts background_line }
  end

private
  def move_cursor(direction_char)
    if /^[ABCD]$/ !~ direction_char
      raise "invalid direction char"
    else
      printf "\e[1#{direction_char}"
      STDOUT.flush
      sleep @sleep_time
    end
  end
end

class Drawer
  def initialize(size_x, size_y, pic_data)
    @pixel = Pixel.new
    @pixel.draw_background(size_x, size_y)
    @method_table = {
      'l' => 'left',
      'r' => 'right',
      'u' => 'up',
      'd' => 'down',
      'p' => 'draw_pixel',
    }
    @pic_data = pic_data
    @data_element = /(\d+)([a-z])/
  end

  def draw
    @pic_data.strip.split("\n").join("").scan( @data_element ) do |s|
      action(s)
    end
  end

private
  def action(act)
    num = act[0]
    method = act[1]

    eval <<"    EOS"
        #{num}.times { \@pixel.#{ @method_table[method] } }
    EOS
  end

end

pic_data=<<"EOS"
12u4r1p1l1u1p1u1p1d1p1d1p1l1d5p1u1p1l1u1p1u1p1d1p1d1p1d1p1d1p1d1p1l
1d1p1l1d1p1l1d1p1l1d1p2l1d1p2l1d1p16l8u2r1p2l1d1p2l1d1p1l1d1p1l1d1p1l1d1p1l1d1p
1d1p1d1p16r10u3p3l2d3p2l1u1p1l1d1p1l1d1p1l1d2p1r3u3p2l1u1p1l
1d1p1l1d1p1l1d1p2l1d1p3r4u3p3l2d3p2l1u1p1l1d1p1l1d1p1l1d2p1r3u3p2l1u1p1l
1d1p1l1d1p1l1d1p2l1d1p24l2d1p1l1d1p1l1d1p1d1p1d1p1u1p1u1p1l
1u1p1l1u1p4l1d3p5l4u1p2l1d1p6r1u1p1d1p16l9d
EOS
drawer = Drawer.new(36, 16, pic_data)
drawer.draw



【広告】

[2009.08.27(Thu) 01:26] Rubyの文法Trackback(0) | Comments(0) 見る▼
↑TOPへ

rubyでハッシュのハッシュのハッシュとかを簡単に作る方法 

2009年08月20日 ()
Perlだと、特に宣言なしに、

$a{'size'}{'upperbody'}{'chest'} = 100;



とか出来るのに Ruby だといちいち Hash.new() など宣言しなくてはならず不便です!

しかし以下のおまじないを唱えると、ハッシュのハッシュのハッシュとかを一気に宣言できちゃって便利ったらありゃしません。

my_hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc)}

my_hash[:size][:upperbody][:chest] = 100
my_hash[:size][:egg] = 'XL'

my_hash =>
{:size=>{:upperbody=>{:chest=>100}, :egg=>"XL"}}



というのが使い方で、とっても便利ですね、いろんな場面で使えそうです!


以下は、なんでーそうなるの?と個人的に追っていった考察メモです。こんな考察するなんて私って粘着質ですね。

まず、Hash.newの引数にブロック(上の例でいうと{|h,k| h[k]=Hash.new(&h.default_proc)})を与えるってどういうこと?についてですが、

rubyオンラインマニュアル

値が設定されていないハッシュ要素を参照するとその都度ブロックを実行し、その結果を返します。ブロックにはそのハッシュとハッシュを参照したときのキーが渡されます。

とあります。

つまり
my_hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) }
my_hash[:aaa] = 'bbb'

とした時点で、
my_hash[:aaa] = Hash.new()
my_hash[:aaa] = 'bbb'
もやってくれるし、さらに一階層深いハッシュが作られた場合にHash.new()をする準備、例えば以下のようなこと
my_hash[:aaa][:aaa2] = Hash.new()
をしてくれる準備も整ってるよ、という状態になります。うまく言えないけど、そんな感じ。

上記の
&h.default_proc
という部分が
{|h,k| h[k]=Hash.new(&h.default_proc) }
を指しているから再帰的に処理される訳ですね。うまく言えてないなあ。でもそんな感じ。

これ考えた人天才だわ。

参考サイト
http://www.ruby-forum.com/topic/130324
http://snippets.dzone.com/posts/show/4146


【広告】

[2009.08.20(Thu) 09:28] Rubyの文法Trackback(0) | Comments(0) 見る▼
↑TOPへ

コマンド実行してパイプで受け取った出力の各行を処理する 

2009年03月30日 ()
本当に久しぶりの記事更新だというのに小ネタで勝負!

あるLinuxコマンドをパイプで渡して各行を処理したい的なことを、仕事で行う必要があったので書き留めます。

例えば、" ls -1 " の実行結果をカッコで囲んであげたい!(特に実用性はないけど)のような場合は以下のように書きます。

IO.popen('ls -1', 'r') { |pipe|
  pipe.each { |line|
    line.chomp!
    puts '[' + line + ']'
  }
}



rubyは楽しいっすね!と改めて思う。

【広告】

[2009.03.30(Mon) 00:36] Rubyの文法Trackback(0) | Comments(0) 見る▼
↑TOPへ

TOP | NEXT