将布尔值作为字符串传递给需要字符串的方法
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
在 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