这是我的方法。它检查文件是否可用。我怎么把它弄干?
@@filepath = nil
def self.file_usable?
return false unless @@filepath
return false unless File.exists?(@@filepath)
return false unless File.readable?(@@filepath)
return false unless File.writable?(@@filepath)
return true
end
我应该使用某种循环吗?
答案 0 :(得分:4)
def self.file_usable?
@@filepath and File.exists?(@@filepath) and File.readable?(@@filepath) and File.writable?(@@filepath)
end
答案 1 :(得分:2)
我不会这样做,但是因为你要求"只是重构所有这些方法对同一个变量的行动" ...
def self.file_usable?
@@filepath && [:exists?, :readable?, :writable?].all? { |m| File.send(m, @@filepath) }
end
如果您以编程方式需要决定必须检查哪些方法,这可能很有用。如果这是一个孤立的功能,我会写:
def self.file_usable?
f = @@filepath
f && File.exists?(f) && File.readable?(f) && File.writable?(f)
end
答案 2 :(得分:1)
您可以使用File#stat并检查mode
值。
s = File.stat("testfile")
other_can_rwx = s.mode && 0007
答案 3 :(得分:1)
当我的主要关注点是可读性时,我经常使用这种技术:
def self.file_usable?
[@@filepath,
File.exists?(@@filepath),
File.readable?(@@filepath),
File.writable?(@@filepath)].all?
end
请注意,这种方法存在很大差异,因为所有表达式都会被评估。
以下是有效的,因为永远不会调用nil.some_method
:
nil and nil.some_method
然而,这将引发异常,因为始终评估所有内容:
[nil, nil.some_method].all?
答案 4 :(得分:0)
这可能不是一个好主意,但理论上你可以这样做:
def self.file_usable?
File.writable? @@filepath rescue nil
end
答案 5 :(得分:0)
另一种变化:
CHECK_METHODS = [:exists?, :readable?, :writable?] \
.map{ |m| File.method(m) } \
.unshift(lambda{ |x| x })
def self.file_usable?
CHECK_METHODS.all? { |m| m[@@filepath] }
end