5677


`File.exist?`でファイルの存在確認をするときに引数が`nil`の可能性があれば

[code]

    File.exist?(filename) if filename
    
[/code]

と書いているのですが、`try`に近い形で`filename`が`nil`なら`nil`を返し、`String`であれば`File.exist?`の処理を行う定番の書き方はありますか？

自分でメソッドを定義する必要があるのであれば現在の書き方を維持していこうと思っているのですが  
より良い書き方があるなら知りたく質問させていただきました。

`active_support`のような使えるメソッドをまとめて読み込む形の物も採用していこうと考えています。


CC BY-SA 3.0
2015-01-31T22:41:43.717
5674
2016-12-04T15:45:47.267
3271
question
ruby
File.exist? の引数が nil だった時に nil または false を返す方法


定番の書き方はわかりませんが、

[code]

    File.exist?(filename.to_s)
    
[/code]

とすれば `filename` が`nil`でも`String`でも存在チェックが実行できます。

[code]

    > File.exists?(nil)
    TypeError: no implicit conversion of nil into String
        from (irb):1:in `exists?'
        from (irb):1
        from /Users/jit/.rbenv/versions/2.2.0/bin/irb:11:in `<main>'
    > File.exists?(nil.to_s)
    => false
    
[/code]

ちなみにもし、true/false/nilの3種類を区別して返したい、という場合はその背景まで含めないと適切な回答がしにくいです。（何か特殊なことをやろうとしているのかもしれません）

通常はfalse/nilはどちらも偽として扱われるので、わざわざ区別するのはレアケースだと思います。


CC BY-SA 3.0
2015-01-31T23:50:32.143
5677
2015-01-31T23:50:32.143
85
5674
answer


いろいろやりようがありそうです。どれにするかは好みによると思います。  
自分なら以下のどちらかでやります（多分最初の）。  
なおこの辺の構文は結合法則がややこしかったりするので、結果を代入に使ったりするなら全体をカッコで括ったほうが確実です。

`filename && File.exist?(filename)`  
`filename ? File.exist?(filename) : nil`

なお質問の内容にもう少し合わせるならこういう感じでしょうか。異常時に`filename`が`nil`であることを期待できるならここまでする必要はありませんが。

`filename.is_a?(String) ? File.exist?(filename) : nil`


CC BY-SA 3.0
2015-02-10T17:47:57.587
6275
2015-02-10T19:06:29.670
2015-02-10T19:06:29.670
8210
8210
5674
answer


後置ifでなくifの条件式の話であれば、

[code]

    if !filename.to_s.empty? && File.exist?(filename)
    
[/code]

と書きます。filenameが空文字でないことが文脈上明らかか想定しなくてよいのであれば

[code]

    if filename && File.exist?(filename)
    
[/code]

とします。

後置ifなら(File.exist?は例として不適切なので)

[code]

    do_something(filename) unless filename.to_s.empty?
    
[/code]

とかでしょうか。どちらにしても、多少冗長になってもfilenameのチェックをしているという意図を明白にする方を選びます。

`File.exist?(filename.to_s)`や`do_something(filename.to_s)`だと

  * `#to_s`がnilよけであること
  * メソッドが空文字を許容するかどうか(nilだった場合に空文字を渡すことは意図した動作なのか)

がコード上明白でないので私なら避けます。逆に言えばそれらが明白である場面ならそう書くかもしれません。


CC BY-SA 3.0
2015-02-13T00:29:09.447
6414
2015-02-13T00:29:09.447
5793
5674
answer


かなり前の自分の質問への回答になるのですが今同じ処理を書くとすると`filename`変数に`Pathname`を使い、

[code]

    filename.try(:exist?)
    
[/code]

とします。このページを見た人の参考になればと思い書いておきます。


CC BY-SA 3.0
2016-12-04T15:45:47.267
30894
2016-12-04T15:45:47.267
3271
5674
answer