我需要在lnk.href
上执行许多方法才能获得f_name
。
我想以这种方式编写代码,但它给了我
undefined method `gsub!' for nil:NilClass (NoMethodError)
如果我不想在一行中写这些(因为它很难阅读),那么Ruby中更好的方法是什么?
f_name = lnk.href.split('/').last
.gsub!(/[(]+/, "_")
.gsub!(/[)]+/, "_")
答案 0 :(得分:6)
String#gsub!
会返回nil
:
'1'.gsub!(/2/, '_')
# => nil
'1'.gsub!(/2/, '_').gsub!(/1/, '_')
# NoMethodError: undefined method `gsub!' for nil:NilClass
# from (irb):6
# from C:/Ruby200-x64/bin/irb:12:in `<main>'
将gsub!
替换为gsub
可能会解决您的问题:
'1'.gsub(/2/, '_')
# => "1"
'1'.gsub(/2/, '_').gsub(/1/, '_')
# => "_"
答案 1 :(得分:0)
这不是由于语法原因,而是因为某些方法在您的情况下返回nil
。
答案 2 :(得分:0)
所以,如果我理解正确的话,你是想尝试编写一些你想在新行上链接的方法,以使其更具可读性?正如您所发现的那样,您无法将方法调用单独打破到新行,因为现在Ruby认为您正试图在任何情况下调用方法。
我的假设是你想要完成的事情是这样的:
lnk = <a href="https://stackoverflow.com/questions/21620460/how-to-chain-methods-in-ruby">Some Link</a>
f_name = lnk.href.split('/').last.gsub!(/[(]+/, "_").gsub!(/[)]+/, "_")
所以,你试图通过在/
拆分它们,然后拉出并操纵URL的最后部分来查找和拆分HTML中的链接。
您可以采取一些措施来使其更具可读性和逻辑性。一个是修复你的正则表达式。由于您使用的是.gsub!
,因此您已经在搜索所有匹配的匹配项,因此+
是不必要的。您还可以将对.gsub!
的两次调用合并为一个:.gsub!(/[()]/, "_")
这将匹配并替换所有出现的打开或关闭的paren,使你的链一个方法更短。
对于其他人,我建议在逻辑位置将其分为两个步骤:在创建数据结构和操纵数据结构之间。首先,创建子串数组:
f_name = lnk.href.split('/')
然后操纵该数组中的数据:
manipulated_substring = f_name.last.gsub!(/[()]/, "_")
这将使您的代码更具可读性,并保持数据的完整性!