可以将用于private / protected的Ruby 2.1简写用于类方法吗?

时间:2014-08-25 15:23:20

标签: ruby private protected ruby-2.1

在Ruby 2.1中,def现在返回一个符号

[1] pry(main)> def foo; end
=> :foo

一个很酷的用例是因为privateprotected是采用符号并将方法设为私有的方法,您现在可以create a private method like so

private def foo
end

但是,我无法使用类方法。这段代码:

protected def self.baz
end

会出错:protected': undefined method 'baz' for class 'User' (NameError)"

有没有办法让它发挥作用?

2 个答案:

答案 0 :(得分:5)

您可以通过使用类的单例类来实现:

class Foo
  def self.baz
    ...
  end

  class << self
    private :baz
  end
end

或一次尝试:

class Foo
  class << self
    private def baz
      ...
    end
  end
end

因此,class << self块中执行的所有内容都将应用于类级别。导致私有/受保护的类方法。

答案 1 :(得分:4)

private是一种用于将实例方法标记为私有的方法。类方法的等价物是private_class_method,所以相同的习语会有点笨拙和多余:

private_class_method def self.foo
  #...
end