2009-10-23 70 views
6

我学习Ruby和一些文档中找到此代码示例:语法是什么?在这个Ruby例子中是什么意思

require 'find' 

    total_size = 0 

    Find.find(ENV["HOME"]) do |path| 
    if FileTest.directory?(path) 
     if File.basename(path)[0] == ?. 
     Find.prune  # Don't look any further into this directory. 
     else 
     next 
     end 
    else 
     total_size += FileTest.size(path) 
    end 
    end 

目的是总结所有文件的文件大小的树,但不包括以点开始的目录。行if File.basename(path)[0] == ?.显然正在执行目录名称测试。我会这样写:

if File.basename(path)[0] == "." 

?.是做什么的? (我猜可能是一个错字。)我还没有看到其他地方描述的这种语法。

回答

11

?.返回点的ASCII值。你可以把几乎任何字符的问号后能得到它的ASCII值,如?a?3?\\等,他们不是比较字符串"."的原因是,当你索引到一个字符串,你得到的ASCII该索引处的char值而不是char本身。要获取特定索引处的字符,您可以使用[0, 1]作为索引。因此,选项有:

if File.basename(path)[0] == ?. 

或者:

if File.basename(path)[0, 1] == "." 

甚至:

if File.basename(path)[0].chr == "." 
+0

谢谢!我现在回想一下关于该操作员的内容这位Perl程序员有很多事情要去忘记。 – 2009-10-23 19:40:53

1

这意味着返回下一个字符的字符代码。在Ruby中,字符串[0]为您提供了一个字符代码,所以它就像是第一个字符是“。”。

有趣的是,这意味着像???!?!??表述是完全在Ruby中的法律。

看看here

+0

我还没有找到红宝石的那部分是 “简单易学”。 – 2009-10-23 19:43:19

+0

我不知道这是否是令人难以置信的简单易学,但它确实有很多非常好的方面它的语法。我主要是一个JavaScript程序员,并且我希望我有许多次使用Ruby的块语法或其“一切都返回一个值”的正交性。 – 2009-10-23 20:48:25

+1

这是一个完全随机使用的单词正交性。 – Peter 2009-10-23 22:39:39

2

它是的ASCII码点的速记“”字符。请参阅Ruby语法中关于numeric literals的文档。

>> ?. 
=> 46 
>> ?a 
=> 97 
+7

请注意,此行为在Ruby 1.9中发生了变化。在Ruby 1.9中,'?a'返回字符串'“a”,这与索引字符串一致,该字符串也返回一个字符串而不是数字。 – newacct 2009-10-23 19:50:59