2017-02-16 7 views
0
$ ruby -v; rails -v; grep DESCR /etc/lsb-release; psql --version 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] 
Rails 4.2.0 
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS" 
psql (PostgreSQL) 9.5.5 

CSV.foreach(path, {headers: :first_row}) do |row|を使用して.csvファイルを反復処理しています。データの列の1つがYes/No-ishで、レコードを作成する前にtrue/falseに変換しています。今、私はこれらの2行のコードを使用していますが、私にとっては十分にエレガントではありません。もっと驚いたことに、彼らは私が根本的にルビのブロックを適切に使う方法を理解していないことを指摘しているようです。Ruby CSV :: Row fetch(){ブロック}ブロックをブロックしない

temp = row.fetch("Header42") # { |something| could be processed here... } 
column = (temp.nil? || !(temp.downcase.eql? "yes")) ? false : true 

...しかし、私は少しを行う探しています:再び

、これらは十分に機能します。私はこれを試してみましたが、代わりに希望ブールの未翻訳の文字列になってしまった:

column = row.fetch("Header42") { |r| (r.nil? || !(r.downcase.eql? "yes")) ? false : true } 

ブロックにputsで遊んで私も火にそれを得るように見えることはできません - はるかに少ない私に与えます私はその割り当てに期待しています。

I'm using this as my documentation for CSV::Row.fetch(){}

大変ありがとうございます!

答えて

0

Row.fetch(ヘッダー)は、指定されたヘッダー文字列のフィールドを取得します。フィールドが存在しない場合は、、次にブロックが呼び出され、ブロックにはヘッダー文字列が与えられます。ドキュメントは実際にはこれを示していますが、それはちょっと混乱していることは間違いありません。私は理解する前にソースコードを読まなければなりませんでした。

from CSV::Row.fetch:

所定のヘッダを持つフィールドがある場合、その値が返されます。そうでない場合、ブロックが与えられれば、それはヘッダを生成し、その結果が返されます。

あなたのコードを雄弁にしたい場合はと堅牢、ヘッダが見つからない場合に返されるデフォルトのパラメータを、使用してみてください:

column = (row.fetch("Header42", false)) && (temp.downcase == "yes") 

あなたがヘッダをしませ期待していない場合

+0

このeikoのおかげで、私は明らかにフェッチブロックの使い方を誤解していました。私のファイルの全ての行には "yes/no/nil family"のものがありますので、デフォルト値は決して使用されません。さらに、 'tap 'を使用していませんが、この文脈ではブロックはtrueまたはfalseを返しますが、未修正の文字列オブジェクトは' .tap {}'によって返されます。 –

+0

ああ、 'column = row.fetch(" Header42 ")&& temp.downcase ==" yes "'予期しない^ - ^を期待していますが、 あなたは絶対にありますタップ、私の間違いについての権利!私はタップを使用して、その1ライナーの渇望を常に満たすことはできないと思います。私はそれを私の答えから取り除くでしょう。 – eiko

関連する問題