Ruby 具有内部定义的方法的公共方法与私有方法

Ruby 具有内部定义的方法的公共方法与私有方法,ruby,coding-style,Ruby,Coding Style,如果我有 class SomeClass def some_public_method method_1 method_2 end 其中method\u 1和method\u 2将不会被任何人使用,除非某些公共方法 它们可以在该方法中定义: class SomeClass def some_public_method def method_1 p 'hi' end def method_2 p 'there'

如果我有

class SomeClass
  def some_public_method
    method_1
    method_2
  end
其中
method\u 1
method\u 2
将不会被任何人使用,除非
某些公共方法

它们可以在该方法中定义:

class SomeClass
  def some_public_method
    def method_1
      p 'hi'
    end
    def method_2
      p 'there'
    end
    method_1
    method_2
  end
end

或者单独定义为类中的私有类。我想知道未来哪种方法更容易维护,为什么(这些方法应该“属于”某个\u public\u方法,而不是创建,除非创建了某个\u public\u方法,或者它们应该属于类)。我认为这个问题不是基于观点的,因为“为什么”部分。请提供一些其他代码如何与这两种方法中的任何一种冲突的示例,以证明您的观点,即为什么这两种方法都更适合于更易于维护的代码。

ruby中没有嵌套方法,但您可以编写定义新方法的方法。通过这样做:

class SomeClass
  def some_public_method
    def method_1
      p 'hi'
    end

    def method_2
      p 'there'
    end

    method_1
    method_2
  end

end
方法
method_1
method2
并不是在类声明之后定义的,因为它们的定义尚未执行。只要执行
某些公共方法
,就会执行这些定义,并将这两个方法添加到类中。它们是公共的还是私有的取决于是否对类执行了方法
private
protected
public
(是的,这些都是方法)。如果这些方法都未执行,则它们是公共的

s = SomeClass.new
t = SomeClass.new

s.method_1     #=> undefined method error
t.some_public_method
s.method_1     #=> hi
如果再次运行
some\u public\u方法
,这些方法将被重新定义,这可能会导致警告


简而言之,不要嵌套方法定义,除非您想要一些好的元编程特性。即使如此,使用
define\u method
方法可能更好。

一些其他方法\u 1
一些其他方法\u 2
?你是说
方法1
方法2
?这里的主要原因似乎是你为什么要这样做?您可以将这些方法私有化或模块化。一旦调用main方法
some_public_方法
,这些方法将被定义为实例方法,实例将可以访问这些方法,并且绝不会是私有的。你能解释一下你想这样做的原因吗?否则我认为这不是一个有效的SO问题。“一旦你调用主方法
一些公共方法
,这些方法将被定义为实例方法”…一旦你第二次调用
一些公共方法
,这些方法将再次被定义为实例方法,触发一个“方法重新定义”警告…一次又一次…@JörgWMittag,这完全有道理,你能把它作为一个答案发布出来让我接受吗?到目前为止,没有一个答案能回答您的问题。@engineersmnky,因为这些方法不会在类外使用,并且只有一个公共方法将使用它们。到目前为止,Jorg Mittag的答案只在为什么这种方法不好的问题上有意义。我知道,如果某些公共方法不是第一个,这些方法将不会被执行。我的问题是从设计的角度来看,是最好“嵌套”它们(不是字面意思),还是单独定义它们。这一切是如何运作的并不是问题的重点。@daremkd-这是-嵌套它们不会使它们以任何方式成为私有的,它们仍然可以在任何地方被任何东西执行-因此,除了少数罕见的情况外,应该避免嵌套。清楚完整的答案。美好的第二个版本既危险又烦人。这是危险的,因为它看起来像一个嵌套的方法,而实际上它不是。这是令人恼火的,因为每次执行某个公共方法时,
method1
method2
都会一次又一次地重新定义,这将生成数以百万计的“方法重新定义”警告…您确实在启用警告的情况下运行代码,是吗?@JörgWMittag有没有我可以和你联系的方法?你有电子邮件,skype,什么吗?