Edited at

【Ruby】( ,,`・ω・´)ンンン?ってなった書き方を抜粋

More than 1 year has passed since last update.


まえがき

どうも、デブです。

たまーにRubyを触っては忘却を繰り返していたのですが

ようやくまともに覚えようと奮起しました。(といってもまだ奮起して二日目なのでまた忘れるかも)

さてさて、ある程度プログラマーしてれば

初めて見る言語でも高級言語ならそこそこ読めると思います、が

Rubyという言語は同じことをやるにしても違う書き方が沢山あるようで

書き方によっては、ん?なにこれってなりました。

また単純に特異なシンタックスもあります。

(2000円札的なあっても滅多に使わないよ機能が多い感もある)

ここには初めてRuby触った時に

ん?なんだこれ、どう解釈すればええのん?

ってなったRubyの書き方を抜粋してみました。


基本のキ


セミコロン、引数の()は省略可

それくらい見ればわかるって気もしていたが

そこそこの規模になると、割と混乱する。


code

print "Hello World" # 文字

puts "Hello World" # 文字 + 改行
p "Hello World" # デバッグ用


出力結果

Hello WorldHello World

"Hello World"


リテラルだってオブジェクト

これ結構な曲者じゃないですかね?

ぱっと見ですごく( ,,`・ω・´)ンンン?ってなる。


小数リテラルだってオブジェクトだ

1.2はFloatクラスのインスタンスなのでメソッド使える。


code

p 1.2.class

p 1.2.round


出力結果

Float

1


Range(範囲)リテラルだって書けるのだ


code

p (10..15).class # 10~15の範囲

# rangeを使って10から15までループとか
(10..15).each do |i|
p i
end



出力結果

Range

10
11
12
13
14
15

(10...15).を3個にすると、10から15の一個前(10~14)になる。


シンボルというニュータイプ

ここ最近の言語でちょくちょく見かけるようになったシンボル。

見た目は文字列だけど文字より高速に扱える型のようなイメージ。

正直こういうの凄くほしかったです。

文字の前にコロンをつけるとシンボルになる。


code

symbol = :name # これがシンボル

p symbol


出力結果

:name


とこれだけなら別にふーんなのだが


Hashやら短縮形やらとまざってくると戸惑い学んで汗を流して~

Hash配列のkeyにシンボルを使う場合、:が左にいたり右にいたり

うろちょろするな!ってなる。


code

prices = {:tomato => 100, :onion => 150} # Hash(連想配列)

p prices
prices = {tomato: 100, onion: 150} # 短縮系
p prices


出力結果

{:tomato=>100, :onion=>150}

{:tomato=>100, :onion=>150}


メソッドの引数の指定時とかも戸惑う


code

func :name, {:tomato => 100, onion: 200}


ちょっと変な書き方だけど、これもシンタックス的には合法なわけで

引数の()も省略されてると( ,,`・ω・´)ンンン?ってなる。


なんだこれって思ったら分数が書けるのね


code

p Rational(1/2) + Rational(1/3) # 冗長な書き方

p 1/2r + 1/3r # 短縮系


出力結果

(5/6)

(5/6)


おしりがびっくりしてる

str.upcase!みたいにお尻に!がついているとこうなる。


code

name = 'nekonecode'

p name.upcase
p name
p name.upcase!
p name


出力結果

"NEKONECODE"

"nekonecode"
"NEKONECODE"
"NEKONECODE

メソッド実行時にオブジェクトの中身も変化する。


おしりが疑問を抱いている

真偽値(true or false)が得られる。

これはなんとなく予想つくけれど、!に合わせて載せておきます。


code

name = 'nekonecode'

p name.include?('n') # 文字'n'が含まれる?


出力結果

true



だいたいこのくらい

とりあえず一番( ,,`・ω・´)ンンン?ってなったのはここらへんです。

この先はなんとなく脳内補間出来そうな内容ですが

古い言語中心でやってるとちょっと戸惑うと思ったあたりを書いておきます。


大文字から始まるのは定数

constとかdefineとかはない

VERSION = 1.0

Version = 1.1

ただRubyの定数は上書き可能、実行時にWarning出るだけ。


配列の添え字いろいろ

基本的には他言語と同じだけどこんなのもある。


code

animals = ["cat", "dog", "bird"]

p arr[-1] # 配列の末尾
p arr[0..2] # 0~2まで
p arr[0...2] # 0~2の直前まで


出力結果

"bird"

["cat", "dog", "bird"]
["cat", "dog"]

Rubyはリテラルもオブジェクトというわけでありまして

添え字にはオブジェクトを指定できるわけですね。


Hashと配列のキャストもできるのね


code

prices = {tomato: 100, onion: 150}

p prices.to_a # to_array
p prices.to_a.to_h # to_hash


出力結果

[[:tomato, 100], [:onion, 150]]

{:tomato=>100, :onion=>150}


%記法

下記はどれも"""という文字列を表示しているだけ


code

puts "\"\"\"" # エスケープ文字は可読性が悪い

puts %!"""! # %記法だと見やすい
puts %Q(""") # 上に同じ


出力結果

"""

"""
"""

%記法はいろいろあるのでマニュアル参照のこと


たとえば%記法で文字列配列を定義


code

p %w(cat dog bird)

p %W(cat\ dog bird#{1+2}) # 大文字のWは式展開、バックスラッシュ記法が使える


出力結果

["cat", "dog", "bird"]

["cat dog", "bird3"]


文字列への埋め込み

%は余り求めたり、文字列の埋め込みだったり用途が広いですね。


code

p "数値:%03d, 少数:%10.2f" % [10, 3.1415]



出力結果

"数値:010, 少数:      3.14"



条件を後から書く、後置if

後ろの条件がtrueならその前の部分が実行される。


code

cond = false

p "print!" if cond
cond = true
p "print!" if cond


出力結果

"print!



timesを使ったループ処理

ループの回数が決まっている場合はこうかける。


code

10.times do |i|

puts "#{i}"
end

# またこれはdo ~ end は {}を使ってこう書くこともできる
10.times { |i| puts "#{i}" }


timesIntegerクラスのメソッド、戻り値はEnumeratorオブジェクト。


出力結果

0

1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9


メソッド(関数)


戻り値のreturn は省略可

returnを省略すると最後に評価された値が戻り値になる。


code

def sum (a, b)

a + b
end

p sum 1, 2



出力結果

3



クラス


インスタンス作るときはClassName.new

class Hoge 

なんか処理
end

hoge = Hoge.new


コンストラクタもあるよ

class Hoge

def initialize
# newされたときに呼ばれるぞ
end
end
hoge = Hoge.new


メンバ変数(インスタンス変数)は@を付けましょう

class Hoge

def initialize
@foo = "hello"
end
end


setterとgetter

attr_accessorでsetter,getterを定義


code

class Hoge

attr_accessor :foo, :bar

def initialize
@foo = "hello"
@bar = "bey"
end
end

hoge = Hoge.new
p hoge.foo
p hoge.bar
hoge.foo = "foo!"
hoge.bar = "bar!"



出力結果

"hello"

"bey"


setterはいらないからgetterだけ!

attr_accessorattr_readerにするとgetterだけになる。


code

class Hoge

- attr_accessor :foo, :bar
+ attr_reader :foo, :bar

def initialize
@foo = "hello"
@bar = "bey"
end
end

逆にsetterだけでいいんだって時はattr_writerを使えばいいぞ。


self.がついてたらstaticメソッド(クラスメソッド)


code

class Hoge

def self.hello
puts "Hello!!"
end
end

Hoge.hello



出力結果

Hello!!



@@がついてたらstatic変数(クラス変数)


code

class Hoge

@@foo = 0
end

Hoge.foo # こんな風に外部から参照はできないよ。



クラス直下に大文字で定義したらクラス定数


code

class Hoge

NAME = "Nekonecode" # これはクラス定数、外からアクセスできるよ。
end

p Hoge::NAME



出力

"Nekonecode"



privateメソッドは派生先でも呼べるし上書きもできちゃう。

これ他の言語と同じ感覚でいるとパニックでしょう。


code

class Foo

private
def private_method
p "hello"
end
end

class Bar < Foo
def say
private_method # 親のprivate呼べるぞ
end
end

bar = Bar.new
bar.say



出力

"hello"



code

class Bar < Foo

def say
private_method # 親のprivate呼べるぞ
end

private
def private_method # 親のprivate上書きもいけるぞ
p "override"
end
end

bar = Bar.new
bar.say



出力

"override"



protectedがわかりにくい

一般的なprotectedとは根本的に違う。

やや'friend'に近い。

普通のfriendは関係ないクラスにも秘匿メンバを公開できてしまうが

Rubyのprotectedは同じクラスから生まれた者にだけ公開される。


まとめ

他にもあるとは思いますがざざっと書いてみました。

個人的に一番押さえておきたいなと思ったのはリテラルシンボルでした。

他についてはなんとなく脳内で解釈できるものも多い気はしますが

リテラルとシンボルは知らないとどう読めばいいの?ってなりやすい(気がする)