LoginSignup
16
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-18

まえがき

どうも、デブです。

たまーに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は同じクラスから生まれた者にだけ公開される。

まとめ

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

個人的に一番押さえておきたいなと思ったのはリテラルシンボルでした。
他についてはなんとなく脳内で解釈できるものも多い気はしますが
リテラルとシンボルは知らないとどう読めばいいの?ってなりやすい(気がする)

16
9
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
9