Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这个模式被认为是声明类选项的惯用模式吗?_Ruby - Fatal编程技术网

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