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"
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とかに。
← Python TypeScript →