如何在Ruby中链接方法?

时间:2014-02-07 06:04:24

标签: ruby string

我需要在lnk.href上执行许多方法才能获得f_name。 我想以这种方式编写代码,但它给了我

undefined method `gsub!' for nil:NilClass (NoMethodError)

如果我不想在一行中写这些(因为它很难阅读),那么Ruby中更好的方法是什么?

f_name = lnk.href.split('/').last
         .gsub!(/[(]+/, "_")
         .gsub!(/[)]+/, "_")

3 个答案:

答案 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!(/[()]/, "_")

这将使您的代码更具可读性,并保持数据的完整性!