我如何在ruby类中重构这些条件?

时间:2011-11-27 07:55:47

标签: ruby refactoring

这是我的方法。它检查文件是否可用。我怎么把它弄干?

@@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

我应该使用某种循环吗?

6 个答案:

答案 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