如何在Ruby中解释方法签名?

时间:2013-04-26 08:23:48

标签: ruby-on-rails ruby

对于ActionDispatch::Routing::Mapper::Base modulematch方法的定义如下:

match(path, options=nil)

我在Rails文档中发现的一件事是它没有告诉我这些参数的类型是什么。让我们看一些例子:

match ':controller/:action/:id'

此处,path是一个字符串。

match 'songs/*category/:title' => 'songs#show'

这里是哈希。或者它仍然是一个字符串?我不确定如何解释这种语法。是吗:

{ match 'songs/*category/:title' => 'songs#show' }

其中match 'songs/*category/:title'是关键,'songs#show'是值?或者:

match {'songs/*category/:title' => 'songs#show'}

使用散列作为第一个参数调用match方法?

3 个答案:

答案 0 :(得分:1)

它是字符串或哈希。这是第二个:

  match {'songs/*category/:title' => 'songs#show'}

但哈希实际上是一个参数,所以更正确的是:

  match({'songs/*category/:title' => 'songs#show'})

您可以使用irb中的模拟方法自己尝试:

irb(main):005:0> def match(foo)
irb(main):006:1>   puts foo
irb(main):007:1> end
=> nil
irb(main):008:0> match "somestring"
somestring
=> nil
irb(main):009:0> match :has => "hash"
{:has=>"hash"}
=> nil

答案 1 :(得分:0)

这是

中的哈希
match({'songs/*category/:title' => 'songs#show'})

在最后的参数位置,您可以省略{}。但你不能像

那样写
match {'songs/*category/:title' => 'songs#show'}

因为{}将被解释为一个块,并且会导致语法错误而没有(),这明确表明它是一个参数。

答案 2 :(得分:0)

对于match ':controller/:action/:id',`path是一个字符串。

对于match 'songs/*category/:title' => 'songs#show'path是哈希:

1.9.3p125 :001 > def match(path, options=nil)
1.9.3p125 :002?>   puts path
1.9.3p125 :003?>   puts options
1.9.3p125 :004?> end
 => nil 
1.9.3p125 :005 > match 'foo' => 'bar'
{"foo"=>"bar"}

 => nil