Rubyを始める時のまとめ。
2015.04.10
この記事は最終更新日から1年以上が経過しています。
どもです。
Ruby on Railsで最近もっぱら何かと話題のRuby界隈。
公式サイト
言わずと知れた、「まつもとゆきひろ(通称 Matz)さん」が開発したオブジェクト指向を用いた国産の言語ですね。
と、ふとRubyを書きたくなったので、書こうと思ったのですが、普段日常的には書かないので
「あれ、どんなだっけ」現象。
最近はPHPや TypeScriptや C言語なんかと色々書いたりしていてもう、どれがどうだったかw
と、自分の過去記事を漁る。
Ruby 基本まとめ
http://www.webcyou.com/?p=4915
超わかりずらい。
Interactive Rubyでやってるのでわかりずらいわ。
ざっと書いた感が丸出しでしたね。
そこで、困った時のドットインストール!!w
公式サイト
Ruby
http://dotinstall.com/lessons/basic_ruby_v2/
うん。やっぱり分かりやすいですわ!!!w
というか、田口さんフルスタックすぎますね。いやーすごい。
というわけで初心者でもサクッと入れるように、要点をまとめ文書に起こしてみました。
Ruby
インストール
mac
Ruby 2.0.0 は OS X Mavericks に含まれています。
brewを使ったインストール
brew install ruby
win
windowsの方はRubyInstallerを使ってインストールすると良さげですね。
バージョン確認
ruby -v
拡張子は「.rb」
出力
コメントアウト
#
改行なし
改行あり
puts
データ形式表示
p
例:
print "hello world!" puts "hello world(puts)" p "hello world(p)"
– result
hello world!hello world(puts)"hello world(p)"
変数・定数
変数は小文字始まり。
msg = "hello world"
定数は大文字始まり。
WEBCYOU_URL = "http://www.webcyou.com/"
定数定義後に変更行うとwarning 表示。
オブジェクト、メソッド、クラス
オブジェクト
Rubyのデータはすべてオブジェクトということで、
p "hello world".length
このように扱うことも可能。
– result
11
と、表示。
この辺も、Rubyならではで「おぉーー」となりますよね。
メソッド
組み込みメソッドは全てクラスで作られている。
公式サイトのコアリファレンスに記載している
http://ruby-doc.org/core-2.2.1/
数値オブジェクト -Numeric
整数値、実数値はもちろん分数値も扱えちゃうRubyの数値オブジェクト
さらに、「_」を無視するといった仕様。
x = 10_000_000 p x
– result
10000000
これも変わっていますよねー。
あと、累乗は「**」で使用可能
p 10 ** 3
– result
1000
更に分数値も
p 1/3r * 2
1/3rは 有理数(Rational)の省略でRational(1, 3)と同様、
Rational
クラスを省略して使えるみたいですね。
“r”サフィックスはどうやらruby バージョン2.1〜 使用可能で、ruby バージョン2.0だとエラーでした。
ruby バージョン2.1以下の方は
p Rational(1, 3) * 2
といった形で分数値を求めるかと。
– result
(2/3)
数値に関してもオブジェクトですので、実数値を丸める際
y = 20.5
p y.round
– result
21
とすることが可能。
その他のメソッド等に関しては、コアリファレンスのNumericクラスを参照。
(バージョンは2.2.0)
http://ruby-doc.org/core-2.2.0/Numeric.html
文字列オブジェクト -String
文字列オブジェクトは「” “」か「’ ‘」で囲うことで生成。
特徴として「” “」は変数展開することと、特殊文字を扱うことができる。
「’ ‘」は不可となっております
name = "takayama"x = "hello world, #{name}" y = 'hello world, {name}'puts x puts y
– result
hello world, takayamahello world, {name}
特殊文字
タブコード(\t )や改行コード(\n)も「” “」は展開が可能となっております。
あと便利なのが文字列の繰り返しも
puts "web帳 " * 5
これで可能ですね。
– result
web帳 web帳 web帳 web帳 web帳
その他のメソッド等に関しては、コアリファレンスのStringクラスを参照。
(バージョンは2.2.0)
http://ruby-doc.org/core-2.2.0/String.html
破壊的メソッド、真偽値を返すメソッド
破壊的メソッド
通常
s = "webcyou" puts s.upcase puts s
– result
WEBCYOU webcyou
「!」をつけると破壊的メソッドとしてオブジェクトを変更可能
s = "webcyou" puts s.upcase! puts s
– result
WEBCYOU WEBCYOU
真偽値メソッド
「?」を付与すると真偽値を取得できる。
s = "" p s.empty? # true
配列オブジェクト
rubyの配列の特徴として
添え字で範囲指定「..」
num = [5, 8, 4] p num[0..2]
result
[5, 8, 4]
添え字で範囲指定「…」
num = [5, 8, 4] p num[0...2]
– result
[5, 8]
負の値で配列最後の値取得
num = [5, 8, 4] p num[-1]
– result
4
複数取得「,」
num = [5, 8, 4] p num[1,2]
– result
[8,4]
範囲指定の置換
num = [5, 8, 4] num[0...2] = [1,2] p num
– result
[1, 2, 4]
複数挿入
num = [5, 8, 4] num[1,0] = [10,11,12] p num
– result
[5, 10, 11, 12, 8, 4]
「1,0」は1番目の0個分を意味している。
「1,1」= [10,11,12]とすると、8が置換され、
[5, 10, 11, 12, 4] となる。
これは、便利というか、Rubyの柔軟性の高さ。
範囲指定の削除
num = [5, 8, 4] num[0,2] = [] p num
– result
[4]
これもまた、Rubyならではの特殊な記述の仕方。
「0,2」0番目から2個分を「[]」空に。
他言語と比較して、より直感的に記述していける感じですね。
メソッド
num = [5, 8, 4] p num.size p num.sort
– result
3 [4, 5, 8]
.sortでソートが可能な便利さ。
更にメソッドチェーンも「.」つなぎで可能
num.sort.reverse
– result
[8, 5, 4]
その他、配列に追加するpushを省略して「<<」を用いて利用可能で、複数追加も行える。
num = [5, 8, 4] num << 100 << 102 p num
– result
[5, 8, 4, 100, 102]
その他のメソッド等に関しては、コアリファレンスのArrayクラスを参照。
(バージョンは2.2.0)
http://ruby-doc.org/core-2.2.0/Array.html
コアリファレンスをパッとみて、目に入ったやつで、
hoge = Array.new(3, true); p hoge
– result
[true, true, true]
こんな感じ複数配列生成もできるみたいで、超楽ですね!
ハッシュオブジェクト
sales = {"takayama" => 200, "webcyou" => 300 } p sales["takayama"]
– result
200
まーこの辺は良いとして、Rubyの特徴から シンボルとして扱う場合
sales = {:takayama => 200, :webcyou => 300 } p sales[:takayama]
として記述するとシンボルとして扱うことが可能。
また、Ruby1.9〜はシンボルで扱う際は以下の記述でもOKとの
sales = {takayama: 200, webcyou: 300 }
– result
200
メソッド例として「size」「keys」「values」etc…. キーが存在するかどうかは「has_key?」で判定可能。
p sales.has_key?(:takayama)
– result
true
その他のメソッド等に関しては、コアリファレンスのHashクラスを参照。
(バージョンは2.2.0)
http://ruby-doc.org/core-2.2.0/Hash.html
オブジェクト変換
文字列オブジェクトを数字オブジェクトに(整数値).to_i
a = "10" a.to_i
文字列オブジェクトを数字オブジェクトに(実数値).to_f
a = "10" a.to_f
数字オブジェクトを文字列オブジェクトに .to_s
a = 10 a.to_s
ハッシュを配列に .to_a
h = {takayama: 200, webcyou: 300 } p h.to_a
– result
[[:takayama, 200], [:webcyou, 300]]
配列をハッシュに .to_h
a = [[:takayama, 200], [:webcyou, 300]] p a.to_h
– result
{:takayama=>200, :webcyou=>300}
%記法
%Qで文字列として変換される。なんと。
s = %Q(hello) p s
– result
"hello"
%Q()は %Q{} でも%Q!! でもOKとの事。
シングルコーテーションで変換する場合は小文字 %qで変換が可能。
%Q()は 省略可能で 「%()」「%{}」「%!!」と記述でも同様に扱える。
なんと。
また、文字列の配列の場合は
a = ["a", "b", "c"]
といったものも、%記法を用いて省略が可能。
(小文字のwにするとシングルコーテーション)
a = %W(a b c)
なんと。
条件分岐
条件分岐に関しては以下のような記述で
条件分岐 if 真 else 偽 end
他のプログラム言語とさほど変わらなく、あえてポイントを挙げるとなると endで終了を明示的にするところと、条件を追加する際の「else if」はRubyでは「elsif」と記述するところですかね。
と、省略する記述が特殊な感じですね。
score = 80 if score > 60 puts "OK!" end
これが、省略して 条件分岐箇所は1行で記述することができるのですね。
score = 80 puts "OK!" if score > 60
なんと。楽である。
真偽値
オブジェクトが存在するかどうかもスマートな記述で
if x puts "..." end
その他、三項演算子も他と同様に利用でき、
a = b > c ? b :c
トリッキーだなと感じたのは、「多重代入」ですかね。
b, c = 10, 20
このように複数代入出来るとのこと。おぉ。ワンダフル。
case 分岐
case文に関しては特別なところはなく、
case 比較したいオブジェクト when 値 処理 when 値 処理 else どれも一致しない場合 処理 end
と、このような形で利用できます。
when でこのように when “hoge1”, “hoge2” とカンマ区切りで複数指定できるのはこれまた便利ですね。
繰り返し処理
繰り返し処理で利用する「times」これまた特殊なかんじですよね。
3.times do puts "hello" end
– result
hello</p> <p>hello</p> <p>hello
あと、何回めの処理なのかのindexも取得できますね。
その際は、doのあとに |i| で取得できるようです。
3.times do |i| puts "#{i}: hello" end
– result
0: hello 1: hello 2: hello
while文はこのような感じで使えますね。
while i < 3 do
あと、ループを抜ける処理 「break」の他に「next」もあるとの事。
至れり尽くせり。
if 1 == 0 next end
てな感じで条件が真の時、処理がスキップされます。
for文 each文
for文に関してはこのような感じで利用でき、
for i in 0..2 do puts i end
each文で繰り返し処理を行う場合は
["red", "blue", "pink"].each do |color| puts color end
のような感じで利用できます。
これもまた、配列もオブジェクトとして扱う Rubyぽい記述ですね。
もちろん、配列をそのままハッシュに置き換えて処理を行うことができ、
その際、keyとvalueは 「 || 」 内でカンマ区切りで取得が可能ですね。
{"red"=> 200, "blue"=>100, "pink"=>50}.each do |color, price| puts "#{color}: #{price}" end
– result
red: 200 blue: 100 pink: 50
メソッド
自作メソッドは以下のような記述で定義します。
def 関数名 処理 end
引数がある場合は関数名の後に()で指定。
デフォルト値の指定も可能ですね。
def sayHi(name = "webcyou") puts "hello! " + name end sayHi("takayama") sayHi()
– result
hello! takayama hello! webcyou
返り値を得る際のreturnは省略が可能との事。
なんと。。。
どこまで省略可能なのだ。。
後、関数内で定義したオブジェクトは自動的にカプセル化されるようで、外からのアクセスはできないようです。
クラス
class User def initialize(name) @name = name end def sayHi puts "hello, my name is #{@name}" end end tom = User.new("tom") tom.sayHi()
「def initialize」はクラスからインスタンスを生成する際に処理が行われます。
@hogege と「@」が付与された変数はインスタンス変数となり、クラス内の他定義した巻数から呼び出すことが可能となっております。
クラスメソッド、クラス変数
クラスメソッドを定義する際は、「クラス名.定義関数」で作成できます。
クラスメソッド
def User.sayHello
Userクラス内で上記を定義、インスタンスを生成しなくても呼び出しが可能となります。
User.sayHello()
また、「@@」でクラス変数も定義することができ、のクラスやサブクラス、それらのインスタンスで共有される グローバル変数を作成することができます。
クラスからインスタンスが生成された際にカウントアップするクラス変数
class User @@count = 0 #クラス変数 def initialize() @@count += 1 end def User.sayHello #クラスメソッド puts "hello from User class(#{@@count})" end end
継承
Rubyのクラスの継承は不等号の「<」で行えるとのこと。これまたなんと。
class SuperUser < User
てな感じで。
これまた、楽な感じですね。ふむ。
getアクセサ、setアクセサ(getter,setter)
インスタンス変数を外部から参照するに用いるgetterはRubyでは
def name return @name end
setterはこのような感じでいけるのですが、
def setName(newName) @name = newName end
更に「attr_accessor」を用いると容易に扱えるとのこと。
attr_accessor :name
setterも hoge.name = ‘hoge’ で実行可能。
attr_accessorはgetter,、setterの両方ですが、それぞれの指定も可能。
getterのみ
attr_reader :name
setterのみ
attr_writer :name
クラスが大きくなると、getter、setterだけで行数も増えてしまいがちですが、これは記述が減り、便利ですね。
終わりに
と、改めて書いてみて、Rubyは柔軟性があって書いてて楽しい言語だなと改めて思いました。
Ruby on Rails もきっと容易に扱えて楽しいんだろうなと思います。
機会があったら触って見ようかと思います。
後、何か新しく言語を覚えたりする際は一度「ドットインストール」を確認すると良いですね!改めて便利さを感じましたw
下手に書籍等を購入するより分かりやすいですね(込み入ったことを行う際は話が別です。)
ということで、今回は ドットインストールを参照に Rubyはじめる際のまとめを文書にまとめさせていただきました。
ありがとうございましたmm
公式サイト