Ruby

環境構築

Git Bashは管理者権限で実行すること。

gem install bundler

VSCodeで開発する場合は拡張機能を入れる。

code --install-extension rebornix.ruby

gemのインストール

bundler経由でやる。

bundle install --path vendor/bundle

Gemfileでローカルのgemを指定する

次のディレクトリ構成とする。

hoge-0.1.1.gem
Gemfile

Gemfileではバージョンを指定する必要がある。

gem 'hoge', "=0.1.1",  :path => '.'

あとはいつもどおりインストール。

bundle install --path vendor/bundle

Ref:
https://fujitaiju.com/no-category/699268/

基本

外部クラスを読み込む

class HogeClass
end
require_relative 'hoge.rb'

hoge = HogeClass.new

if

# 代入と同時に判定
if (a = 3) == 3
  puts a # 3
end

モジュール読み込み

次のファイル構成として

src
  main.rb
  modules
    a.rb

modules/a.rbの中身

class Hoge
  A = 1
  B = 2
  C = 3
end

main.rbの中身。require_relativeで他の.rbを読み込める。

require_relative 'modules/a'

# 1
puts Hoge::A

Enum

class Hoge
  A = 1
  B = 2
  C = 3
end

json文字列をハッシュに変換

require 'json'

payload = '{"name": hoge}'

puts JSON.parse(payload)

ハッシュ⇔json変換

hash_str = {
    'a' => 1
}

hash_sym = {
    a: 1
}

# ハッシュのまま表示
puts hash_str # {"a"=>1}
puts hash_sym # {:a=>1}

# jsonに変換
require 'json'
puts hash_str.to_json # {"a":1}
puts hash_sym_to.json # {"a":1}

配列

arr = []

# 追加
arr << 'hoge'

# 配列の範囲指定
# [a...b]でa番目からb番目まで取得
p ['a', 'b', 'c', 'd'][1...2] # 'b', 'c', 'd'
p ['a', 'b', 'c', 'd'][0...-1] # 'a', 'b', 'c'

ハッシュ

# keyがSymbol(Ruby1.9以降の書き方)
symbol_hash1 = {
    name: 'hoge',
    age: 10
}
# keyがSymbol(古い書き方)
symbol_hash2 = {
    :name => "hoge",
    :age => 10
}
# keyがStringのHash
string_hash = {
    "name" => "hoge",
    "age" => 10
}

# symbol -> string 変換
symbol_hash1.stringify_keys

# Hash#map
# map()がハッシュではなく配列を返すので`to_h`を呼ぶとハッシュのまま変換できる
hash.map { |k,v| puts "key=#{k}, val=#{v}"; [k, v] }.to_h

# 文字列キーをシンボルキーに変換
hash.symbolize_keys

正規表現

/^test/.match('test123') #<MatchData "test">

# 正規表現で抽出
m = /^test(\d+)/.match('test123') #<MatchData "test123" 1:"123">
puts m[1] # "123"

Http

gem install httpclient
require 'httpclient'
client = HTTPClient.new
# proxyを使わない
client.proxy = nil

# get
res = client.get('http://localhost:3000')
puts res.body

# post
resPost = client.post('http://localhost:3000')
puts resPost.body

# 
header = {
    'key' => 'auth-key',
    'Content-Type' => 'application/json'
}

body = {
    'name' => nil,
    'age' => 123
}.to_json

response = clnt.post("http://localhost:8080/hoge/",
                     :query => {},
                     :body => body,
                     :header => header)

Ref:
https://qiita.com/aosho235/items/559603ef98587ae4cfc1

Jsonを扱う

連想配列に.to_jsonするとjson文字列が取得できる。
APIに渡すパラメータとかに。

{
    "hoge" => [
        1,
        2,
        3
    ],
    "fuga" => 1
}.to_json

ファイル操作

FileUtilsを使う。
https://qiita.com/prgseek/items/38f74d99b74baa3b42f7
ex)

require 'fileutils'

# 空ファイルの作成
FileUtils.touch("list.txt")

# ファイル内容が同じか
FileUtils.compare_file("a.csv", "b.txt") # true

ハッシュを生成

[1, 2, 3, 4, 5].reduce({}).reduce { |sum, n| sum["#{n}"] = n; sum }
# -> '1' => 1, '2' => 2...

ハッシュでドット演算子を使ってプロパティにアクセスする

require 'ostruct'

obj = {
    :a => 123
}
puts OpenStruct.new(obj).a

Ref: https://stackoverflow.com/questions/9356704/unable-to-use-dot-syntax-for-ruby-hash

ハッシュを変換

# %{var}を"hoge"に変換
obj = {
    'a' => 'aaa%{var}aaa',
    'b' => 'test'
}
puts obj.map { |k,v| [k, v % { :var => "hoge"}] }.to_h

Ref:
https://qiita.com/A-gen/items/4997dbfa7d844b72cd58

プレースホルダを使った文字列展開

puts 'a %{b}' % { :b => "c" }
# a c

Ref: https://stackoverflow.com/questions/15394783/ruby-replace-parts-of-a-string

色付きでコンソールに出力

# 赤文字
print "\e[31mhello\e[0m"

ref:
RubyでANSIカラーシーケンスを学ぼう!

nilだったらデフォルト値を返す

# nilなら'Default'を返す
nil_or_value || 'Default'

# 空配列なら'Default'を返す
hoge_array.empty? ? 'Default' : hoge_array

Tips

ハッシュの特定の要素のみ変換する

 h = {
    a: 1,
    b: 2,
    c: 3,
}
puts h
# {:a=>1, :b=>2, :c=>3}

m = h.map { |key, value| [key, key == :b ? 'B' : value] }.to_h
puts m
# {:a=>1, :b=>"B", :c=>3}
### HTTPリクエストを送信

```gemfile
source "https://rubygems.org"

gem 'httpclient'
@http_client = HTTPClient.new
# @http_client.debug_dev = $stderr
@http_client.proxy = nil

req = {
  url: "localhost:3000",
  header: {
    'Content-Type' => 'application/json'
  },
  body: {
    hoge: 123
  }.to_json
}

res = @http_client.post(req[:url], header: req[:header], body: req[:body])
puts res

コマンドを実行する

open3を使う。

require 'open3'

# コマンド実行
Open3.capture3("echo hoge")
# chdirでコマンドを実行するカレントディレクトリを指定
Open3.capture3("echo hoge", :chdir => "/tmp")

指定できるオプション(chdirなど)はココを参照:
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/spawn.html

値を条件付きで変換する

puts ["fuga"]
  .map { |a| a == 'hoge' ? 100 : a}
  .map { |a| a == 'fuga' ? 200 : a}
  .map { |a| a == 'piyo' ? 300 :kpods a}
# 200

文字列から改行と、連続するスペースを削除

"   hoge  
  hoge
"
.gsub(/[\r\n]/,"").gsub(/ +/," ")

FAQ

Gemfileを変えたのにbundle install結果が変わらない

Gemfile.lockを削除して再挑戦。

gem installでコケる

Rubyのバージョンを変える。2.4とかに。