Ruby固有if结构
我在做一个刮网器。页面的变体很少,程序在每个页面上的工作方式应该有所不同。我需要根据页面上的内容改变它处理页面的方式。如果s:Ruby固有if结构,ruby,Ruby,我在做一个刮网器。页面的变体很少,程序在每个页面上的工作方式应该有所不同。我需要根据页面上的内容改变它处理页面的方式。如果s: if str=data.css('div#imgTag').to_s str.delete('@') #do something elsif str=data.css('span#Title').to_s #do something else elseif str=data.css('span#block').to_s #do something en
if str=data.css('div#imgTag').to_s
str.delete('@')
#do something
elsif str=data.css('span#Title').to_s
#do something else
elseif str=data.css('span#block').to_s
#do something
end
return str
但是上面的代码并不总是有效的。我认为有一个缺陷,我正在寻找一个更好的方法来解决它。我正在寻找更优雅的结构。当时,您可以使用
案例,而不是如果
,当您的几个ifs大约是同一个变量时,它更实用:
否则,我真的不知道你能做得更好。您应该添加更多关于程序上下文和不起作用的内容的详细信息
编辑:@Aetherus在注释中是正确的,您正在使用=
而不是=
进行比较,这将为您的变量赋值,而不是测试它,因此它总是正确的
再次编辑:@Stefan也有道理。如果data.css()
返回nil,to
将返回一个始终为真的空字符串。如果对nil对象()调用,可以使用try(:to_s)
返回nil
您的代码变成:
case str
when data.css('div#imgTag').try(:to_s)
str.delete('@')
#do something
when data.css('span#Title').try(:to_s)
#do something else
when data.css('span#block').try(:to_s)
#do something
end
return str
当
时,您可以使用案例,而不是如果
,当您的几个ifs大约是同一个变量时,这更为实用:
否则,我真的不知道你能做得更好。您应该添加更多关于程序上下文和不起作用的内容的详细信息
编辑:@Aetherus在注释中是正确的,您正在使用=
而不是=
进行比较,这将为您的变量赋值,而不是测试它,因此它总是正确的
再次编辑:@Stefan也有道理。如果data.css()
返回nil,to
将返回一个始终为真的空字符串。如果对nil对象()调用,可以使用try(:to_s)
返回nil
您的代码变成:
case str
when data.css('div#imgTag').try(:to_s)
str.delete('@')
#do something
when data.css('span#Title').try(:to_s)
#do something else
when data.css('span#block').try(:to_s)
#do something
end
return str
没有关键字elseif
是您在此处键入错误吗?str=…
或str==…
?to总是返回字符串,即真实值。因此,您的elsif
永远无法到达。我想建议两件事。尝试Gem mechanize,然后使用Xpath获取确切的元素,并根据需要的数据条件使用switch case。这里没有关键字elseif
是否键入错误?str=…
或str==…
?to\u s
始终返回字符串,即真实值。因此,您的elsif
永远无法到达。我想建议两件事。尝试Gem mechanize,然后使用Xpath获取确切的元素,并针对需要数据的条件使用开关案例。