「return」ではなく「next」を使うと、ブロック引数の途中で得られた値を、そのループでの結果として取得できます。
多くの OS X ユーザはパッケージマネージャとして Homebrew を使っています。 これを使うと本当に簡単に Ruby を手に入れることができます: $ brew install ruby
予定通り、2016年12月25日にRuby 2.4.0が正式リリースされました。
Ruby 2.3が2015年12月25日にリリースされました。
僕がつまずいた Ruby 1.8/1.9/2.0 系の環境の差異をまとめていきます。
RailsにはActionMailerというライブラリがありますが、今回はその中でも使われているMailライブラリ(*1)をご紹介いたします。
sheet.each や row.each ではちゃんとデータが入っている範囲だけを走査してくれます。
・.xlsでもいいからネット上の情報が豊富なやつを使いたい -> spreadsheet ・システムのみでリッチな.xlsxファイルを作りたい -> axlsx ・.xlsxファイルを読み出すだけでいいから気軽に扱いたい -> roo ・テンプレートの.xlsxファイルがあって、それにデータを書き込んで保存したい -> rubyXL
roo-rb/roo はExcelの *.xlsx を読む。
Redmineのデータベースと添付ファイルをcronサービスにより定期的にバックアップし、 Windowsのクライアント環境へ時々バックアップを同期するような方法を実践してみました
結構汎用的に使える?そして、簡単に実装できる? クーロン+シェルを利用したバックアップ処理を書いてみました。
Ruby から外部のコマンドを実行する場合、使えるメソッドは以下のとおりです。 exec system `` IO.popen これらそれぞれの使い方と、実行結果を解説します。
Rubyで外部プログラムを実行する、たいがいのケースはOpen3.capture3でまかなえます。
Open3.capture3 標準入出力を使ったデータのやりとりを簡単に使いたい場合に便利
IO.popenでCLIツールを楽々操作できます。 わざわざパイプで繋がなくとも、対象を引数として与えればサブプロセスとしてやってくれます。
メソッドにはブロックを渡すことができる 渡したブロックは、メソッド内で手続き型のオブジェクトとして扱われる
「どうせブロック引数は一つしか取れないんだから呼び出し箇所をblock.callなんて明示せずに、yieldで統一しちゃえば良いじゃん」 「ブロックは全部yieldが示すんだから、仮引数(&block)もいらなくね?」
つまり& + call == yieldです。 1. &にSymbolオブジェクトが渡されたので、RubyはこれをProcオブジェクトに変換することを試みる。そのためにSymbol#to_procを呼ぶ。 2. そしてSymbol#to_procは、ブロック引数に順次渡されるオブジェクト(ここでは’charlie’などのStringオブジェクト)に対し、 &に渡されたSymbolオブジェクト(ここでは:capitalize)をメソッドとして呼ぶような実装がなされている。
例:ブロックを実行する前で処理を行いたい場合 例:ensureで必ず後始末をしたい場合
**(アスタリスク2つ)も可変長引数ですが、こちらはキーワード引数をハッシュで受け取ることを表しています。 オプション設定が必要なメソッドで使われることが多いと思います。 &block 仮引数(例えばblock)に&(アンパサンド)を前置すると、「ブロック引数」となります。
$stdout.sync = true
STDOUT.sync = true
JenkinsのJobでRubyスクリプトを呼んだら、処理が終わるまで puts とかの標準出力がJenkinsのコンソールに出ない 標準出力がバッファリングされないようにRuby側に以下の記述を追加する $stdout.sync = true
$ ruby -c hoge.rb このように実行すると、 hoge.rb内の構文チェックを行い、正常であれば "Syntax OK" と返してくれます。
rubyでコマンドラインオプションを渡せない実験
Rubyが/usr/bin/rubyにあるとは限らない。システムによってはひょっとすると/usr/local/bin/rubyにあるかもしれない。 この問題を避けるために、しばしばenvコマンドが使われる。
Ruby ではハッシュがよく使われるが、実は構造体も使える。
The abort function does this. For example: abort("Message goes here")
そこで正規表現を使う。判定が安定。 "10" =~ /\d+/ #=> 0