加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 未设置正则表达式全局变量

发布时间:2020-12-17 03:22:02 所属栏目:百科 来源:网络整理
导读:我遇到了一些看似不寻常的事情,我想知道是否有人可以解释原因. 1.8.7 :001 some_str = "Hello World" = "Hello World" 1.8.7 :002 some_str.try(:match,/^(w*)/) = #MatchData "Hello" 1:"Hello" 1.8.7 :003 $1 = nil 1.8.7 :004 some_str.match(/^(w*)/)
我遇到了一些看似不寻常的事情,我想知道是否有人可以解释原因.

1.8.7 :001 > some_str = "Hello World"
 => "Hello World" 
1.8.7 :002 > some_str.try(:match,/^(w*)/)
 => #<MatchData "Hello" 1:"Hello"> 
1.8.7 :003 > $1
 => nil 
1.8.7 :004 > some_str.match(/^(w*)/)
 => #<MatchData "Hello" 1:"Hello"> 
1.8.7 :005 > $1
 => "Hello"

我不确定为什么第一次没有设置全局变量$1,而是设置第二次.任何见解?

解决方法

让我告诉你如何实现尝试.如果您想自己查看,请查看activesupport源.它在 /lib/active_support/core_ext/object/try.rb中定义

class Object
  def try(*a,&b)
    if a.empty? && block_given?
      yield self
    else
      public_send(*a,&b)
    end
  end
end

这基本上做的是将方法名称和完整参数发送给Object. public_send与send相同,但只能用于调用公共方法.

所以我重写了这个,调试你的问题:

class Object
  def try(*a)
    result = public_send(*a)
    puts $1.inspect
    result
  end
end

string = "Hello"
string.try(:match,/^(w*)/)
puts $1.inspect

这输出

"Hello"
nil

所以出现了一个很大的问题:这是ruby解释器中的一个错误吗?也许.至少它没有记录在任何官方来源.我找到了一个参考,告诉以下(See Global variables.)

[…],$_ and $~ have local scope. Their names suggest they should be global,but they are much more useful this way,and there are historical reasons for using these names.

因此看起来$1也不是全局变量,即使它被内核报告为全局变量:

1.9.3-p194 :001 > global_variables
 => [:$;,:$-F,:$@,:$!,:$SAFE,:$~,:$&,:$`,:$',:$+,:$=,:$KCODE,:$-K,:$,:$/,:$-0,:$,:$_,:$stdin,:$stdout,:$stderr,:$>,:$<,:$.,:$FILENAME,:$-i,:$*,:$?,:$$,:$:,:$-I,:$LOAD_PATH,:$",:$LOADED_FEATURES,:$VERBOSE,:$-v,:$-w,:$-W,:$DEBUG,:$-d,:$0,:$PROGRAM_NAME,:$-p,:$-l,:$-a,:$binding,:$1,:$2,:$3,:$4,:$5,:$6,:$7,:$8,:$9]

为了确保这一点,我将这种不完整性转发给Ruby Bug Tracker.见Ruby Bug #6723

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读