2009-10-23 6 views
6

私は、Rubyを学び、いくつかのドキュメントにこのコードサンプルを見つけています:構文は何ですか?このRubyの例では意味がありますか?

require 'find' 

    total_size = 0 

    Find.find(ENV["HOME"]) do |path| 
    if FileTest.directory?(path) 
     if File.basename(path)[0] == ?. 
     Find.prune  # Don't look any further into this directory. 
     else 
     next 
     end 
    else 
     total_size += FileTest.size(path) 
    end 
    end 

目的は、ドットで始まるディレクトリを除く、ツリー内のすべてのファイルのファイルサイズを合計することです。行if File.basename(path)[0] == ?.は明らかにディレクトリ名テストを実行しています。私はこのようにそれを書かれているだろう:?.

if File.basename(path)[0] == "." 

何をしますか? (タイプミスかもしれない、と思う)私はこのシンタックスが他のところで説明されているのを見ていない。

答えて

11

?.は、ドットのASCII値を返します。 ASCIIの値を得るには、疑問符の後ろに文字を入れてください(?aまたは?3または?\\など)。文字列を"."と比較しない理由は、文字列にインデックスを付けるとASCII char自体ではなく、そのインデックスでのcharの値。特定のインデックスでcharを取得するには、[0, 1]をインデックスとして使用できます。だから、オプションは次のとおりです。

if File.basename(path)[0] == ?. 

または:

if File.basename(path)[0, 1] == "." 

あるいは:

if File.basename(path)[0].chr == "." 
+0

ありがとう!私はそのオペレーターについて読んでいます。このPerlプログラマは、多くのことを見逃しています。 –

1

これは、次の文字の文字コードを返すことを意味します。 Rubyでは、文字列[0]を使うと文字コードが得られるので、最初の文字は "。"と言います。

興味深いことに、???!?!??のような表現はRubyでは完全に合法であることを意味します。

hereをご覧ください。

+0

私が "習得が容易" であるルビーのその部分を見つけるためには至っていません。 –

+0

私はそれが信じられないほど学びやすいのかどうかはわかりませんが、構文には本当に素晴らしい面がたくさんあります。私は主にJavaScriptのプログラマーであり、Rubyのブロック構文や "すべてが価値を返す"直交性を持っていればいいと思います。 –

+1

これは、直交性という言葉を全くランダムに使用しています。 – Peter

2

"。"のASCIIコードポイントの略語です。キャラクター。 Rubyの構文のnumeric literalsのドキュメントを参照してください。

>> ?. 
=> 46 
>> ?a 
=> 97 
+7

この動作はRuby 1.9で変更されています。 Ruby 1.9では '?a'は文字列' 'a" 'を返します。これは文字列のインデックス付けと一致し、文字列の代わりに文字列を返します。 – newacct

関連する問題