3

有人可以为我解释一下来自 Lucky Stiff 的 Camping 微框架的这部分代码:

# Simply builds a complete path from a path +p+ within the app.  If your
# application is mounted at <tt>/blog</tt>:
#
#   self / "/view/1"    #=> "/blog/view/1"
#   self / "styles.css" #=> "styles.css"
#   self / R(Edit, 1)   #=> "/blog/edit/1"
#
def /(p); p[0] == ?/ ? @root + p : p end

资源

4

2 回答 2

4
def /(p);

方法名是' / ',它接收参数' p '

p[0] == ?/

检查字符串是否以' / '开头。问号用于指定字符是按字面意思使用的。您也可以将其视为与“/”相同

p[0] == ?/ ? exp1:exp2

第二个问号用于条件评估。如果表达式(p[0] == ?/) 为真,则计算 exp1,否则计算 exp2。

因此,在上述情况下,如果字符串参数以“/”开头,则返回值@root + p,即在其前面加上 root。另一方面,如果参数不以'/'开头,则按原样返回。

于 2011-12-12T07:17:53.110 回答
0

这是另一种写法:

def /(p)
  if p[0] == ?/
    @root + p
  else
    p
  end
end

p[0]返回字符串中的第一个字符。?/返回/字符。请注意,在 1.8 中,字符由整数 ( ?/ == 47) 表示,而在 1.9 中,它是单字符字符串 ( ?/ == "/")。尽管如此,p[0]将始终与?/.

所以在更高的层次上,它会检查字符串中的第一个字符是否是斜杠,如果是,它会在它前面加上@root(在 Camping::Base#initialize 中设置)。

因此,如果您的应用程序安装在 /blog,@root == "/blog"并且self / "/post/1" == "/blog/post/1".

于 2011-12-12T09:19:23.360 回答