在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()方法抛出的自定义错误?
答案 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)