将布尔值作为String传递给期望String的方法

时间:2017-11-16 16:22:14

标签: ruby fastlane

在Ruby中,我试图将布尔结果传递给一个接受字符串作为参数的方法。这是一个实验。

fileexists = File.file?("#{$fileLocation}")

puts File.file?("#{$fileLocation}")
puts fileexists
puts fileexists.to_s

这将导致:

true
true
true

现在,如果我尝试调用接受字符串的方法并以多种方式传递此参数。

slack(message: "#{fileexists}")

导致错误消息。

'message' value must be a String! Found TrueClass instead.

这让我感到困惑,因为我理解Ruby会将“”中的任何内容评估为String。因此,在占位符中放置TrueClass对象应该有效地将此值转换为字符串。

所以让我们尝试略微不同的东西:

slack(message: "#{fileexists.to_s}")

这会导致相同的错误。

'message' value must be a String! Found TrueClass instead.

现在这就是真的很棒的地方!!

slack(message: "#{fileexists.to_s} ")
slack(message: "#{fileexists} ")

如果我在占位符之后的字符串末尾添加一个单位空格,它就会传递,并且以我的方式发送一条松弛消息,显示“true”。

我知道我可能会在这里要求一些'水晶球'的见解 我没有'slack'方法的实现,这可能是实现方式的结果。

Ruby是否会检查params的类型,因为它们是这样传递的?

这是您可能收到的Ruby标准错误消息,还是slack()方法抛出的自定义错误?

3 个答案:

答案 0 :(得分:1)

我知道我可能会在这里要求一些“水晶球”的见解,因为我没有实施'松弛'方法,这可能是实施方式的结果。

听起来你正在使用包含方法gem which gem_name的lib(gem),你可以在控制台上检查运行slack的gem代码位置。

Ruby会检查params的类型吗?

没有

这是您可能收到的Ruby标准错误消息,还是slack()方法抛出的自定义错误?

自定义错误

正如Jorg W Mittag所说,在尝试反序列化,然后检查类型时,这看起来像是松弛方法的错误实现。你可以通过贡献这个gem monkeypatch it来修复gem上的松弛方法,或者你可以尝试以它的方式破解它......这最后的onde取决于"\"#{fileexists}\""的实现方式,可能还有一对额外的引号,例如fileexists = File.file? $fileLocation

PS:你不必将字符串嵌入到另一个字符串中,如果你要像configuration()一样使用它,这应该可行。

答案 1 :(得分:1)

您正在使用的依赖项,fastlane,自动转换传递给操作的值(您对slack的调用)。

原因是fastlane中的参数也可以通过命令行指定,因此转换是必要的。它会自动将"true"的值转换为布尔值,因为ruby中没有Boolean类,并且通过为其指定类的名称来指定参数类型,因此它会自动转换{{1}一个布尔值。代码中的违规行是here

正如您在上面的代码中看到的,解决方法是执行"true"slack(message: "#{fileexists.to_s.capitalize}")。只要你避免使用yes,YES,true,TRUE,no,NO,false和FALSE

答案 2 :(得分:0)

我只是在这里猜测,因为我们不知道slack的方法定义是什么期望一个未命名的String,但是你传递了一个哈希值。

slack(fileexists.to_s)