LoginSignup
1
0

More than 3 years have passed since last update.

Ruby チェリー本復習

Last updated at Posted at 2021-01-17

なにこれ

筆者がチェリー本を読んだ時のメモをまとめた記事です。

ぼっち演算子「&.」

変数(レシーバー)がnilだった場合はnilを返して、nilじゃなければ右辺の処理を実行する
変数に値がある or nilか確定できない時に使うと簡潔に書ける。

user = suga
p user&.upcase #=> SUGA

user = nil
p user&.upcase #=> nil

ちなみにそのままnilにupcaseメソッドを使うと下記のエラーが出る

user = nil
p usesr.upcase

undefined method `upcase' for nil:NilClass (NoMethodError)
# NoMethodError:NilClassのnilオブジェクトにupcaseメソッドは定義されてません

rubyは配列の最後にカンマをつける文化らしい

jsonとかとは違って厳密に管理しないから、配列の最後にカンマをつけるみたい。
「カンマつけるかどっちでも良い=じゃあつけよう!」みたいな感じですかね。

array = [
  'hoge',
  'fuga',
  'piyo',
]

**でハッシュを展開する

h={hoge: 'hoge', piyo: 'piyo'}
p a = { fuga: 'fuga', **h } #=> {:fuga=>"fuga", :hoge=>"hoge", :piyo=>"piyo"}

配列を順番に処理する時、「&:method」を使う

内部にprocをつかうことで引数にブロックを取れる

a = ['a','b','c']
p a.map(&:upcase)

nilが渡される可能性のある配列は、Array(users)みたいにArrayクラスを定義して、引数に変数を渡せば処理できる。nilの場合は[ ]が返る

||=

railsとかのソースコードでよく見るこれ。毎回忘れるので備忘録として書きます。
下記は全て同じ意味。省略して書けるのがメリットです。

test = nil
p test ||= 'hoge' #=> ‘hoge’

p obj.foo #=> nil
p obj.foo || (obj.foo = true) #=> true

test = nil
if test.nil?
  p 'hoge'
else
  p test
end #=> ‘hoge’
test = 'fugaaaaaaaaaaaa’
p test ||= 'hoge #=> ‘fugaaaaaaaaaaaa’

test = 'fugaaaaaaaaaaaa’
if test.nil?
  p 'hoge'
else
  p test
end #=> ‘fugaaaaaaaaaaaa’

any?メソッド

一つ以上条件が満たせばtrueを返す

array_and_nil = [1, 2, nil, nil, 5]
p array_and_nil.any?(&:nil?) #=> true
require 'active_support/all'

hoge = nil
def piyo(hoge)
  hoge || return
end
piyo(hoge) #=> nil

2重for文を避けられる。でも使い所が難しそう

tx = %w(1 2 3 4 5)
ty = %w(a b c d e)

for point in tx.product(ty)
  p(point)
end

&:

下記みたいなコード。渡すブロックを省略できる。

これができる条件
1.ブロック引数が1個だけ
2.ブロックの中で呼び出すメソッドには引数がない
3.ブロック引数にメソッドを1回呼び出す以外の処理がない

n=[1,2,3,4,5,6]
n2=n.select(&:even?)

attr_accessor

呼び方は、個人的にアトリビュートアクセッサーって読んでる。
周りの人はアクセッサーって言ってるかも

役割は、端的に言うと下記のコードを1行で書ける

  def name
    @name
  end

  def name=(name)
    @name = name
  end

上の6行のコードが次の1行になる

  attr_accessor :name

インスタンスからクラスメソッドを呼び出す方法

self.class.【クラスメソッド】すればおk

class User
  def self.self_
    p 'self'
  end
  def instance_
    self.class.self_
  end
end
a = User.new
a.instance_ #=> 'self'

既存のメソッドのエイリアスを作成した後にメソッドを上書き➡️prepend?

特定のオブジェクトだけに結びつくのが、特異メソッド(シングルトンオブジェクトとも言う)

hoge = 'hoge'
def hoge.hello
  p 'hoge!'
end
hoge.hello #=> 'hoge!'

includeはモジュールのメソッドをインスタンスから呼べるようにする。
extendはクラスメソッドにする

1
0
0

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
1
0