RSpec の is_expected で raise_error を検知したかった
RSpec では subject
と is_expected
を利用して次のようにテストを書くことが出来ます。
context "test" do subject { 42 } # is_expected の内部で subject が呼び出される it { is_expected.to eq(42) } end
raise_error を使いたかった
次のように raise
が発生する場合は is_expected
を利用することが出来ません。
context "test" do subject { raise RuntimeError } it { is_expected.to raise_error(RuntimeError) } end
これは is_expected
が内部で expect(subject)
という風に呼び出されるためです。
raise_error
をテストするためには expect { subject }
という風にブロックで呼び出す必要が有ります。
回避方法
このような場合、subject
で proc
を返すようにすると上手く動作します。
context "test" do subject { -> { raise RuntimeError } } it { is_expected.to raise_error(RuntimeError) } end
素直に expect { subject }
を呼び出すメソッドがほしいですねえ。
参照
Vim 7.4.2244 で :filter コマンドが追加された
Vim 7.4.2244 で :filter コマンドが追加されました。
これは :filt[er] /{pat}/ {command}
という風に使用でき、{command}
の出力結果を {pat}
でフィルタリングして出力されます。
" oldfiles で .vim ファイルのみを出力する filter /.vim$/ oldfiles
ちょっとフィルタリングしたい場合に便利そう。
ただし、:echo
の出力の場合はフィルタリングされない模様。
Vim でタイマーを一時停止する
気がついたら Vim 7.4.2180 で timer_pause()
なるものが追加されていました。
これは、任意の Timer を一時停止たり再開したりすることが出来ます。
" 一時停止 call timer_pause(timer, 1) " 再開 call timer_pause(timer, 0)
[ストップウォッチ]
と、言うことで簡単なストップウォッチをつくってみた
function! Start() let counter = 0 let timer = timer_start(1000, { -> [execute("let counter += 1 | echo counter", ""), counter]}, { "repeat" : -1 }) function! Pause() closure call timer_pause(timer, 1) endfunction function! Restart() closure call timer_pause(timer, 0) endfunction endfunction
Vim script 進化しまくり。
Vim script で lambda を使用する際の注意
@pink_bangbi lambda式をパースする際に、外側のスコープにアクセスしている変数が1つでもあるかチェックしています。なければキャプチャはしません。で、文字列の中まではパースしないのでそういう動作になってしまいます。
— K.Takata (@k_takata) 2016年8月25日
と、いうことなので次のような lambda も上手く動作しません。
function! s:main() let value = 2 let F = { xs -> filter(xs, "v:val % value == 0") } " Error: E121: 未定義の変数です: value echo F(range(1, 10)) let F = { xs -> filter(xs, "v:val + value") } " Error: E121: 未定義の変数です: value echo F(range(1, 10)) endfunction call s:main()
明示的に変数を指定してキャプチャする機能がほしくなりますね。
Vim 7.4.2268 でインクリメンタルサーチ時に移動するキーが <C-p>/<C-n> から <C-t>/<C-g> に変更された
[関連]
Vim 7.4.2259 でインクリメンタルサーチ中にマッチ位置を起動する機能が追加されたんですが、既存のキーの挙動を破壊していたため別のキーに割り当てられました。
[Vim 7.4.2268 からの挙動]
Vim 7.4.2268 では、
<C-t>
で前のマッチ<C-g>
で次のマッチ
というような挙動になり、<C-n>
と <C-p>
は以前の挙動(検索履歴の移動)に戻りました。
Vim 7.4.2259 でインクリメンタルサーチ中にマッチ位置を移動する機能が追加された
[追記]
Vim 7.4.2268 で挙動が変わりました。
Vim 7.4.2259 で 'incsearch'
を有効にして検索(/
)した際にマッチした単語の位置を移動する機能が実装されました。
これにより
<C-p>
で前のマッチ<C-n>
で次のマッチ
にカーソルを移動することが出来ます。
[注意]
これにより <C-p>
/<C-n>
の挙動が変更されたため、それ以前の『検索履歴を移動する』という機能が使えなくなりました。
もし『検索履歴を移動する』という機能を使用したいのであれば 'incsearch'
を無効にすることで以前のような挙動を行うことが出来ます。
set noincsearch
Ruby 2.3 の Numeric#positive? と Numeric#negative?
Ruby 2.3 から Numeric#positive?
と Numeric#negative?
が追加されました。
これはそれぞれ self > 0
と self < 0
を返します。
p 42.positive? # => true p -42.positive? # => fasle p 42.negative? # => false p -42.negative? # => true p 0.positive? # => false p 0.negative? # => false
Rubocop では Ruby 2.3 を使ってると value > 0
が value.positive?
を使えと怒られます。