Ruby の勉強を初めて気になったところをあれこれと

 

Ruby の勉強をやり初めて気になったところというのを数回に渡ってちょびちょびと書いていたのを1つにまとめてみました。タイトルからだと内容が連想されないですし、パート3まであって余計に何がなんだかさっぱり分からないってな事に自分でもなってしまっていたので、まとめて「気になったところ」という内容にします。
流行りのリメイク商法というものです(嘘です)。

ではでは。

・変数の入れ替えがこんな簡単にできる

熟練度は低いですが基本的にはCの頭で出来ているので、これには少し驚き桃の木。

irb(main):001:0> x = 1
=> 1
irb(main):002:0> y = 5
=> 5
irb(main):003:0> x, y = y, x
=> [5, 1]
irb(main):004:0> x
=> 5
irb(main):005:0> y
=> 1

 ・*をつかえば配列の要素という事にできる

いつ使うのかイメージが湧きませんが、頭に入れておいて損はないという予感がビビビときたので載せておきます。

irb(main):001:0> x, *y = 1, 2, 3
=> [1, 2, 3]
irb(main):002:0> x
=> 1
irb(main):003:0> y
=> [2, 3]
irb(main):004:0> x, y, *z = 1, *[2, 3, 4]
=> [1, 2, 3, 4]
irb(main):005:0> x
=> 1
irb(main):006:0> y
=> 2
irb(main):007:0> z
=> [3, 4]

 ・ド・モルガンってこんなのだっけ…

公式なんて正直覚えてないですが内容は当たってますって言い方をするのはおかしいけれどw
当たってます。

irb(main):068:0> if !(a > 1 && a > 4) then p 'hoge' end
"hoge"
=> "hoge"
irb(main):069:0> if !(a > 1) || !(a > 4) then p 'hoge' end
"hoge"
=> "hoge"

irb(main):072:0> if !(a > 1 || a > 4) then p 'hoge' end
=> nil
irb(main):073:0> if !(a > 1) && !(a > 4) then p 'hoge' end
=> nil

 ・モジュールの特徴

●インスタンスを生成できない
忘備録的な意味で書いておこう。いつ使うのかわからんけど。
●継承することができない。
クラスと違ってモジュールは継承できないという事だね。

・モジュール関数の呼び方

●モジュールをレシーバにして呼び出す。ここではMathを呼んでます。

irb(main):005:0> Math.sqrt(2)
=> 1.4142135623730951

●Includeする。ここではMathを呼んでます。

irb(main):008:0> include Math
=> Object
irb(main):009:0> sqrt(2)
=> 1.4142135623730951

・autoloadは指定したモジュール、クラスが最初に参照された時に自動的にrequireされる。

名前からするとプログラム実行時にloadされそうな、名前の印象からして効果を間違えそうなのだけれど、実行時にloadするのってrequireやん?と冷静に考えればどうということはない。ってか。

・クラスは

クラスはだいたいObjectクラスから派生したサブクラス。定義したクラスもスーパークラスを定義しなかった場合は、自動的にObjectクラスを継承する。

irb(main):025:0* hoge = 'a'
=> "a"
irb(main):026:0> hoge.class
=> String
irb(main):027:0> hoge.class.superclass
=> Object

irb(main):028:0> hoge = 1
=> 1
irb(main):029:0> hoge.class
=> Fixnum
irb(main):030:0> hoge.class.superclass
=> Integer
irb(main):031:0> hoge.class.superclass.superclass
=> Numeric
irb(main):032:0> hoge.class.superclass.superclass.superclass
=> Object

irb(main):002:0> Array.class.superclass
=> Module
irb(main):003:0> Array.class.superclass.superclass
=> Object

irb(main):010:0> Range.class.superclass.superclass
=> Object

irb(main):012:0* SyntaxError.superclass.superclass
=> Exception
irb(main):013:0> SyntaxError.superclass.superclass.superclass
=> Object

irb(main):001:0> class Hoge
irb(main):002:1> end
=> nil
irb(main):003:0> Hoge.superclass
=> Object

・キーワードリテラル

irb(main):001:0> nil
=> nil
irb(main):002:0> true
=> true
irb(main):003:0> false
=> false
irb(main):004:0> self
=> main
irb(main):006:0> __FILE__
=> "(irb)"
irb(main):007:0> __LINE__
=> 7
irb(main):008:0> __ENCODING__
=> #<Encoding:UTF-8> 

 ・オブジェクトは”ポインタのようなもの”らしいけれど

オブジェクトについて理解できていない状態だと説明文を読んだらそのまんま、”ポインタのようなもの”としか解釈ができにゃいなあ。
オブジェクト参照」という単元の説明もあったけれど、この結果を見た方が分かりやすい気がします。ただ、これを見ると”ポインタのようなもの”というか、”これはポインタだ”と思っちまうのだよね。ポインタのことをどれだけ理解しているのかは置いといてだ。

irb(main):001:0> a  = "Ruby"
=> "Ruby"
irb(main):002:0> b = c = "Ruby"
=> "Ruby"
irb(main):003:0> a.equal?(b)
=> false
irb(main):004:0> b.equal?(c)
=> true
irb(main):008:0> a == b
=> true

 ・0.0/0.0 は数字ではないけれど

数字とみなすと 0 だのな

irb(main):003:0> num = 0.0/0.0
=> NaN
irb(main):004:0> num
=> NaN
irb(main):006:0> a.to_i
=> 0
irb(main):010:0> a.to_f
=> 0.0

・例外処理が初見では分かりにくいぜ

そのまんま。使ってみないと分かりにくい。

#!/home/takeken/.rbenv/shims/ruby

begin
  file = File.open('hoge.txt')
rescue
  puts 'Fileがみつかりませぬ'
ensure
  file.close if file
end

 ・例外オブジェクトあれこれ

お手軽だ。今のところ例外を活かしたものが書けていないので使わないとだ。

e.class
[takeken@localhost]$ ./hoge.rb
Error occurred (Errno::ENOENT)
e.message
[takeken@localhost]$ ./hoge.rb
Error occurred (No such file or directory @ rb_sysopen - hoge.txt)
e.backtrace
[takeken@localhost]$ ./hoge.rb
Error occurred (["./hoge.rb:4:in `initialize'", "./hoge.rb:4:in `open'", "./hoge.rb:4:in `<main>'"])

 ・レシーバ・引数なしでメソッドを呼び出すときはカッコを省略できない

そのままの意味です。

・ブロックとして渡す

こういう書き方もできるみたいで、この辺はあんまり根詰めてやっちゃうとおいらの頭だとパニックしそうだから、だいたいで流しておこうと思う。

#!/home/takeken/.rbenv/shims/ruby

people = %w(Alice Bob Charlie)
block = Proc.new do |name|
  puts name
end
people.each &block

[takeken@localhost]$ ./hoge.rb
Alice
Bob
Charlie

 ・RequireしたファイルのパスはLOADED_FEATURESという変数に追加される

調べてみた。なるほど。

irb(main):001:0> x = p $LOADED_FEATURES

irb(main):002:0> p x.last(1)
["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/dependency.rb"]
=> ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/dependency.rb"]

irb(main):003:0> require 'json'
=> true
irb(main):004:0> p x.last(1)
["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/json.rb"]
=> ["/home/takeken/.rbenv/versions/2.1.5/lib/ruby/2.1.0/json.rb"]

 ・数値じゃない?

to_i で数値化しないと、数値を入れようが、zero? そんなメソッド知らんと言われる。他にもto_i などなど色々とある。

#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

n = ARGV[0].to_i

if n.zero?
puts '0でした'
elsif n.even?
puts '偶数です'
elsif n.odd?
puts '奇数です'
end

理由はこれ(と思う)

irb(main):001:0> ARGV[0].class
=> NilClass
irb(main):002:0> 1.class
=> Fixnum
irb(main):003:0> ARGV[0].to_i.class
=> Fixnum

 ・こんな感じでもウゴク

何となく、これで動くんだって思ったので登録。
まだまだ慣れてない感じがありあり。
久しぶりにPythonを見て、閉じないんだ!って思うくらい馴染んでない。

#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

class Hoge
 def moge
  yoge = 'roge'

    case yoge
     when 'roge' then
     'Yes!'
     when 'woge' then
     'no'
     end
 end
end

you = Hoge.new

p you.moge
[takeken@localhost ~]$ ruby test.rb
"Yes!"

 ・ローカル変数の扱いはC言語の時と同じ感じだけれど

プロトタイプ宣言とかなくてクラスはライブラリでまとめてrequireするのがRuby… と思う。
でもRubyをやりだしてJqueryがまだ見れるようになった。

[takeken@localhost ~]$ ruby test.rb
a
Alice
Bob
Carol
"Carol"
""

[takeken@localhost ~]$ cat test.rb
#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

name = ''

class Hoge

    def tage

        for name in %w(a Alice Bob Carol)
            puts name
        end

        p name
    end
end

hoge = Hoge.new()

hoge.tage

p name

上と下は同じです。
分けて書いてみると変数がどうなっているか分かりやすいのかな。

[takeken@localhost ~]$ ruby test.rb
a
Alice
Bob
Carol
"Carol"
""
[takeken@localhost ~]$ cat test.rb
#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

require './hoge.rb'

name = ''

hoge = Hoge.new()

hoge.tage

p name
[takeken@localhost ~]$ cat hoge.rb
#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

class Hoge

    def moge

        languages = %w(Perl Python Ruby)                                                       
        i=0 

        while i < languages.length
            puts "Hello, #{languages[i]}."
            i += 1
        end
    end 

    def tage

        for name in %w(a Alice Bob Carol)
            puts name
        end 

        p name
    end
end

 ・BEGINの扱い。

最初に読み込むBEGIN。実行結果を見てみると!!が出ていないのがわかる。
BEGINにいった後はまた上からだってのが分かりやすいと思ったスクリプト。


#!/home/takeken/.rbenv/shims/ruby
# coding: utf-8

print " and "

END {
print "!!\n"
}

print "World\n"

exit!

BEGIN {
print "Hello"
}

exit!
[takeken@localhost ~]$ ruby hoge.rb
Hello and World

 ・こんなのもありでオモロイ。

CのPrintfの記述式が使える。

irb(main):002:0> printf("%.10f\n", Math.sqrt(2))
1.4142135624
=> nil

 ・エンコードにも色々あるらしい

ファイルじたいの文字コードもあり、色々と奥が深い。

p Encoding.default_external #デフォルト外部エンコーディング
p Encoding.default_internal #デフォルト内部エンコーディング
p Encoding.locale_charmap #現在のロケール

 

これで少しはまとまった情報になったかな。
たまーに見直すときだったりにまた見返せるといいな。

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *