相关疑难解决方法(0)

Ruby:$ 1是什么意思?

我正在观看关于多态关联的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

ruby

22
推荐指数
2
解决办法
1万
查看次数

在方法定义中使用$ 1,$ 2等全局变量

给出以下两段代码:

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将被以同样的方式,就好像块的方法定义中给出的评价?

ruby scope pseudo-globals

8
推荐指数
1
解决办法
1004
查看次数

gsub中的反斜杠(转义和反向引用)

考虑以下代码段:

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解释它的方式,因此有人可以解释这是怎么回事吗?

我该怎么做才能得到上面想要的替代品?

ruby regex backreference replace escaping

4
推荐指数
1
解决办法
1770
查看次数

标签 统计

ruby ×3

backreference ×1

escaping ×1

pseudo-globals ×1

regex ×1

replace ×1

scope ×1