Ruby 这个模式被认为是声明类选项的惯用模式吗?
这个模式可以声明类级别的选项吗?这里考虑的Ruby 这个模式被认为是声明类选项的惯用模式吗?,ruby,Ruby,这个模式可以声明类级别的选项吗?这里考虑的选项是什么?类(类名以大写字母开头)?常数?类中的正常变量 class Markdown Options = { no_intra_emphasis: true, fenced_code_blocks: true, strikethrough: true } def initialize(text, options = {}) @text = text @options = options.rever
选项是什么?类(类名以大写字母开头)?常数?类中的正常变量
class Markdown
Options = {
no_intra_emphasis: true,
fenced_code_blocks: true,
strikethrough: true
}
def initialize(text, options = {})
@text = text
@options = options.reverse_merge!(Options)
end
end
这是正常还是不正常并不重要。它是有效的,并且可能是有用的。它是一个引用散列的常量,不是类,也不是变量
并不是说类名以大写字母开头。常量以大写字母开头,类名是其特例。但资本并不一定意味着常数。方法名可能以大写开头,也可能不以大写开头。它是常用还是不常用并不重要。它是有效的,并且可能是有用的。它是一个引用散列的常量,不是类,也不是变量
并不是说类名以大写字母开头。常量以大写字母开头,类名是其特例。但资本并不一定意味着常数。方法名可能以大写字母开头,也可能不以大写字母开头。您能在几秒钟内说出它在做什么以及为什么吗?如果是这样的话,它会有效地传达它的观点,即使它有点不惯用。在本例中,它似乎为@options
定义了一些默认值,因此对我来说它看起来不错-除非它在整个程序的上下文中做了其他事情,在这种情况下,它会让人困惑,因为它除了看起来做的事情之外还做了其他事情
另外,Options
大写,表示应将其视为常量,理想情况下不应在运行时更改。这也是类名通常大写的原因:它们通常是常量。(Ruby实际上并没有强制执行这一点。它是一种惯例,用于在不使用元编程技术的情况下更容易判断哪些值不应更改。)您能在查看它的几秒钟内说出它在做什么以及为什么吗?如果是这样的话,它会有效地传达它的观点,即使它有点不惯用。在本例中,它似乎为@options
定义了一些默认值,因此对我来说它看起来不错-除非它在整个程序的上下文中做了其他事情,在这种情况下,它会让人困惑,因为它除了看起来做的事情之外还做了其他事情
另外,Options
大写,表示应将其视为常量,理想情况下不应在运行时更改。这也是类名通常大写的原因:它们通常是常量。(Ruby实际上并没有强制执行这一点。这是一种惯例,用于在不故意使用元编程技术的情况下更容易判断哪些值不应更改。)由于选项
是一个常量,我宁愿使用类似于选项
的名称,这更接近Ruby惯例(您可以看到,id使用的名称类似于中的File::Constants::APPEND
)。它现在的编写方式让我想到的是类而不是常量。由于Options
是常量,我宁愿使用类似于Options
的名称,这更接近Ruby约定(您可以看到,在中,id使用的名称类似于文件::常量::APPEND
).现在的编写方式让我想到的是类而不是常量。库也这样做;常量在那里被称为默认选项。库也这样做;常量在那里被称为默认选项。那么声明选项的惯用方式是什么呢?我不确定是否有。我认为合并一个default options hash是最常用的方法,所以这实际上非常惯用。@Kevin Taro删除的注释以及您所说的正确的注释都是错误的。以大写字母开头的标记可能是常量,也可能不是常量。是的,但使用大写标识符传达值应被视为常量是惯用的做法。@Kevin as for Ruby 2或更高版本存在命名参数。那么声明选项的惯用方法是什么呢?我不确定是否有。我认为合并默认选项哈希是最常见的方法,因此这实际上非常惯用。@Kevin Taro删除的注释以及您声明的正确性都是错误的。以大写字母开头的标记可能是错误的,也可能不是常量。是的,但使用大写标识符传达值应被视为常量是惯用做法。@Kevin对于Ruby 2或更高版本,存在命名参数。人们可以更改您的选项:Markdown::Options=42
和Markdown::Options[:no\u intra\u emphasis]=42
?ps.只有第一个片段会发出警告!@DarekNędza,如果有人可以更改标记::选项[:无内部强调]=42
他们还可以将选项散列传递给initialize
方法。因此他们没有动机篡改选项
您显示的方式,对吗?好吧,您不知道邪恶/*愚蠢*用户。我的观点是选项
可以被任何人、任何地方更改,有时您甚至不知道。您可能认为 m1=Markdown.new“a”
第1行中定义的值等于m2=Markdown.new“a”
在第45行定义,但在第42行有人修改了选项的一部分,使这两个变量不相等。@DarekNędza我明白了。我认为在散列上调用freeze
很容易避免这一点,不?不要太信任freeze
。至于散列,ruby冻结指针,因此对于这个散列:h={a:2,b:[1,2,3],c:'string'}
您不能将新值分配给h
(h=42
),也不能将新值分配给键(h[:a]=42
),但您可以修改数组(h[:b][1]=42
),并且可以修改在位字符串(h[:c].gsub(“i”,“*”
).您是否同意人们可以更改您的选项
:Markdown::Options=42
和Markdown::Options[:no\u