Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

よく使うHomebrewのコマンドをまとめてみた #3

環境構築でお世話になっているHomebrewでよく使っているコマンドを振り返った。

1. Homebrewとは

Mac専用のパッケージ管理ツール このツールを使ってパッケージをインストールできる。 下のコマンドでMacにインストールできる。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewの公式サイト
Homebrewのリポジトリ

2. よく使うコマンド

  • install
    使い方: brew install インストールしたいパッケージ名
    このコマンドで最新版の特定パッケージのインストールできる。
    ただし、最新版ではなく古いパッケージをインストールしたい場合はこのコマンドだけではできない。
    またアンイストールする際はbrew install アンインストールしたいパッケージ名と実行する。

  • search
    使い方: brew search パッケージ名
    brewを使ってインストールできるパッケージを調べることができる。
    もしも古いパッケージがインストールしたかったらこのコマンドを使うと便利。

  • edit
    使い方: brew edit パッケージ名
    パッケージをインストールするために必要なファイル(Formula/パッケージ名.rb)を編集できる。
    brew searchをしてもパッケージが見つからなかったらファイルを編集するのもあり。

  • info
    使い方: brew info パッケージ名
    特定のパッケージの情報(バージョンやパッケージの詳細、GitHubでのリポジトリのURL)を確認できる。

  • list
    使い方: brew list
    自分がインストール(brew install)したパッケージの一覧を見ることができる。

  • help
    使い方: brew help
    brewで使用できるコマンドの一覧を確認できる。

ほかにもbrew updatebrew upgradeを使ってパッケージやbrew自体をアップデートできる。

rubyの文字列をメソッドとして扱えるsendメソッドについて #2

実際に"某変数をメソッドとして使用したいが、型が文字列なので実行できない"と困ったときに
学んだメソッドsendについて振り返った。

1. sendメソッドについて

公式ガイドより参照。

send (Object)
--< 省略 >--

obj.send(name, [arg, ...])

--< 省略 >--
sendメソッドは、レシーバの持っているメソッドを呼び出します。第1引数nameにはメソッド名をシンボルか文字列で指定します。メソッドの引数を指定したいときは、第2引数arg以降に引数を並べます。戻り値は、呼び出したメソッドの戻り値が返ります。

2. 実際に書いてみた。

今回は、次のファイル(index.rb)を作成した。

class Drink
  def price(n = 100)
    "This drink is #{n} yen!"
  end

  private
  def ad
    "Buy this"
  end
end

one = Drink.new

p one.send(:price)
p one.send("price",120)

結果は下のようになった。

> ruby index.rb
"This drink is 100 yen!"
"This drink is 120 yen!"
"Buy this"

今回分かることは2つ。

  • 結果の1行目と2行目からは型がシンボルで書かれたメソッドでも文字列で書かれたメソッドでも
    send()を使用して実行可能なことが分かる。

  • 結果の3行目からプライベートなメソッドでもsend()を使用して実行できることが分かる。
    もちろんprivateのメソッドについてはメソッドのまま使用するとエラーが発生する。

注意したいrubyの演算子||=の使い方#1

最近Ruby演算子||=を使用していて便利だと思っていたが
特に式の左辺について注意しなければいけない点があるようなので今から解説。

  1. ||=とは

ドキュメント(https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)より参照。

文法
式1 op= 式2     # 式1は通常の代入の左辺のいずれか
--< 省略 >--
この形式の代入は
式1 = 式1 op 式2
と評価されます。ただし、op が &&, || の場合には、
式1 op (式1 = 式2)
と評価されます。この違いは属性参照のときに
obj.foo ||= true
が、
obj.foo = obj.foo || true
でなく
obj.foo || (obj.foo = true)
と呼ばれることを示します。(obj.foo= は obj.foo の結果によって呼ばれないかも知れません)  

なんとなく使い方は分かるがobj.foo= は obj.foo の結果によって呼ばれないかもというのがよくわからなかったので簡単なコードを書いてみた。

  1. 実際に書いてみた。

・式1(左辺)が未定義の場合
実際に下のコードを動かしてみる。

index.rb

def greeting(time)
  p 'ready to greet'
  if time == 'morning'
    return 'Good Morning'
  elsif time == 'day'
    return 'Hello'
  end
end

say_something ||=greeting('day')

p say_something

このときsay_somethigはまだ未定義。 実際に動かしてみた。

ruby index.rb
>"ready to greet"
>"Hello"

確認できることは2つ。 - greetingメソッドが実行されたこと。 - 未定義だったsay_somethingが'Hello'と定義されたこと。

・式1(左辺)が定義済の場合
今度は上のコードに一行追加した。

def greeting(time)
  p 'ready to greet'
  if time == 'morning'
    return 'Good Morning'
  elsif time == 'day'
    return 'Hello'
  end
end

say_something = 'Bye' #追加しました
say_something ||=greeting('day')

p say_something

このときsay_somethigは''Bye'と定義された。

実際に動かしてみました。

ruby index.rb
>"Bye"

確認できることは2つ。 - greetingメソッドが実行されなかったこと。 - Byeと定義されたsay_somethingは'Bye'のままだったこと。

これからは||=を使用する際には左辺の定義に注意して書く。