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.)
因此看起来$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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |