27

在 Ruby 中,标准约定是在方法名称的末尾使用问号来指示方法返回布尔结果:

[].empty?   #=> true 

另一个标准约定是,如果方法具有破坏性(即,它修改了原始数据),则方法名称以感叹号结尾:

mylist.sort! # sort mylist in-place

最近我在 Scheme 中看到了这些相同的约定。这让我想知道,还有哪些其他语言使用/支持这个约定?是否有其他特殊字符通常用于这些或其他语言的命名?

4

4 回答 4

19

答案当然是特定于语言(和语言文化)的。

例如,根据语言,以下所有选项都是合适的:empty-p、empty?、empty、is_empty 或 isEmpty。(当然,这些例子不包括在内)。

原始问题中的示例来自Ruby where such use of ? 和 !结束方法名称在适当的情况下被接受。这种接受来自 1) 作为语法中的符号终止符易于访问 2) 使用 ? 和 !在标准库中。但是,需要注意的是!并不普遍用于暗示“副作用”,并且通常只出现在替代形式上:保存/保存!,排序/排序!等。有绝大多数方法执行没有!的副作用。字首。

就个人而言,如果我正在设计一种语言,我会允许?,!和 ' 是符号名称中有效的不带引号的尾随字符。即使某些语言允许完全符号转义,例如 Scala,但通常会避免使用此类符号,因为必须引用它们以供使用是很痛苦的。

// in Scala, esp. with Java-compat, the last form is generally used although
// the first two are perfectly valid -- do what makes sense in the language
foo.`empty?`
foo.empty_?
foo.isEmpty

在罗马的时候...

  • Scala -empty?还是 empty_?(不常见)
  • C/C++/JS/Java/Python/Perl - 不?或者 !在标识符中;JS/Java 允许 $; $ 是 Perl 中的标志
  • C/C++/Perl/JS - 举起手来?
  • C# - IsEmpty(方法或属性)或 Empty(属性)
  • Python - 每个 Guido 指南的 is_empty 或 isEmpty (虽然通常是len协议if not len(foo): "empty!":)
  • Java - 语言指南中的 isEmpty
  • Ruby - 特殊尾随?和 !(引用?)
  • JS - 间接标识符访问:obj["empty?"](对此不常见)
  • Lisp(常规):empty-p 表示谓词;读者/引用的变化
  • 朱莉娅 -追加!到修改其参数的函数

很高兴看到更正和/或补充——只是杯水车薪。

于 2009-10-21T03:00:14.253 回答
3

我不是函数名中特殊字符的忠实粉丝,但我也会用一根湿芹菜来消除痛苦,我会在文件名中添加空格的任何人 :-)

变体可以很容易地用类似的?东西isEmpty()!变体来完成sortInPlace()

英语是一种适应性很强的语言,即使没有标点符号。

在任何一种情况下,我选择的语言(C 和 Java)都使用标点符号来表示各种其他事物。将它们放在标识符中也会使词法分析成为一场噩梦。

于 2009-10-21T02:54:54.387 回答
1

在 C# 中将“@”添加到方法名称(或任何标识符)之前,您可以使用通常保留的关键字来命名该方法。

void null() {}
// Invalid token 'null' in class, struct, or interface member declaration

void @null()
// compiles

不要这样做;它主要用于机器生成的代码,例如数据集。 MSDN 页面上的主题。

于 2009-10-21T02:31:58.660 回答
-2

如果将 Javascript 算作一门语言,许多框架似乎都使用“$”字符来表示“选择器”;例如,可以$("id-of-some-item")在 Prototype.js 或$("#id-of-some-item")jQuery 中使用来选择编写的标签<div id="id-of-some-item">。这些选择函数的使用实际上是相当复杂和强大的(如果你有兴趣,在prototypejs.org和jquery.com查看他们的支持文档),但他们归结为做一些我认为语义上与你相似的事情表明的。

同样,这是假设您将 Javascript 视为一种语言。

于 2009-10-21T02:26:54.040 回答