我正在观看关于多态关联的RailsCast. http://railscasts.com/episodes/154-polymorphic-association?view=asciicast
有三种不同的模型文章,照片和事件,每个都评论来自Comment.rb.(article_id,photo_id和event_id各自的文章,照片和事件).在列出评论时,他有问题找出列出评论的3个模型中的哪一个,所以他在索引动作中这样做
def index
@commentable = find_commentable
@comments = @commentable.comments
end
def find_commentable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
Run Code Online (Sandbox Code Playgroud)
我的问题是,是什么$1?
给出以下两段代码:
def hello(z)
"hello".gsub(/(o)/, &z)
end
z = proc {|m| p $1}
hello(z)
# prints: nil
Run Code Online (Sandbox Code Playgroud)
def hello
z = proc {|m| p $1}
"hello".gsub(/(o)/, &z)
end
hello
# prints: "o"
Run Code Online (Sandbox Code Playgroud)
为什么这两段代码的输出不同?有没有一种方法,以块传递到gsub从方法定义之外,这样的变量$1,$2将被以同样的方式,就好像块的方法定义中给出的评价?
考虑以下代码段:
puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')
Run Code Online (Sandbox Code Playgroud)
打印结果(如ideone.com所示):
hello hello \0 \0
Run Code Online (Sandbox Code Playgroud)
这非常令人惊讶,因为我希望看到这样的东西:
hello \0 \hello \\0
Run Code Online (Sandbox Code Playgroud)
我的观点是,这\是一个转义字符,因此您编写\\以获得一个文字反斜杠,因此\\0是一个文字反斜杠,\后跟0,等等。显然,这不是gsub解释它的方式,因此有人可以解释这是怎么回事吗?
我该怎么做才能得到上面想要的替代品?