将布尔值作为字符串传递给需要字符串的方法

Passing Boolean value as a String to a method expecting a String

在 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 将 "" 中的任何内容都作为字符串进行评估。因此,将 TrueClass 对象放置在占位符中应该有效地将此值转换为字符串。

所以让我们尝试一些稍微不同的东西:

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

这会导致同样的错误。

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

现在这就是事情 变得非常奇怪的地方!!

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

如果我在占位符后的字符串末尾添加 一位空格 ,它会通过,并向我发送一条松弛消息,显示 'true'.

我知道我可能想在这里寻求一些 'Crystal-ball' 的见解,因为 我没有 'slack' 方法的实现,这可能是实现方式的结果。

Ruby 是否在像这样传递参数时检查参数的类型?

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

我知道我可能需要一些 'Crystal-ball' 的见解,因为我没有 'slack' 方法的实现,这可能是一个结果实施方式。

听起来您正在使用包含方法 slack 的库 (gem),您可以检查 gem 代码位置 运行 gem which gem_name你的主机。

Ruby 会像这样检查参数的类型吗?

没有

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

自定义错误

正如 Jorg W Mittag 所说,这看起来像是在尝试反序列化然后检查类型时对 slack 方法的错误实现。您可以通过为此 gem、monkeypatch it 做出贡献来修复 gem 上的 slack 方法,或者您可以尝试按原样破解它……最后一个 onde 取决于 slack 已实施,可能会添加一对额外的引号,例如 "\"#{fileexists}\""

PS:如果您要按原样使用它,则不必将字符串嵌入另一个字符串中,例如 fileexists = File.file? $fileLocation,这应该有效。

我只是在猜测,因为我们不知道 slack 的方法定义需要什么未命名的字符串,但您传递的是哈希值。

slack(fileexists.to_s)

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

原因是fastlane中的参数也可以通过命令行指定,所以需要进行转换。它会自动将 "true" 的值转换为布尔值,因为 ruby 中没有 Boolean class 并且通过给它一个 [= 的名称来指定参数类型23=],因此它会自动将 "true" 转换为布尔值。代码中有问题的行是 here.

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