我的值将是以下四项之一:布尔值true,布尔值false,字符串“ true”或字符串“ false”。我想将字符串转换为布尔值(如果是字符串),否则将其保持不变。换一种说法:
“真实”应变为真实
“假”应该变成假
true应该保持true
错误应保持错误
!!(if input == 'false' then true else input end)
。第二个!
将返回值转换为与您想要的相反的布尔值。第一个!
然后进行更正。这个“把戏”已经存在了很长时间。并非每个人都喜欢它。
我的值将是以下四项之一:布尔值true,布尔值false,字符串“ true”或字符串“ false”。我想将字符串转换为布尔值(如果是字符串),否则将其保持不变。换一种说法:
“真实”应变为真实
“假”应该变成假
true应该保持true
错误应保持错误
!!(if input == 'false' then true else input end)
。第二个!
将返回值转换为与您想要的相反的布尔值。第一个!
然后进行更正。这个“把戏”已经存在了很长时间。并非每个人都喜欢它。
Answers:
def true?(obj)
obj.to_s.downcase == "true"
end
obj.to_s.downcase == 'true'
downcase!
,您将少分配1个对象。 downcase
将复制现有字符串。当Frozen String Literals成为Ruby的默认选项时,这将变得无关紧要。
如果您使用Rails 5,则可以这样做ActiveModel::Type::Boolean.new.cast(value)
。
在Rails 4.2中,使用 ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
。
行为略有不同,例如在Rails 4.2中,将检查true值和false值。在Rails 5中,仅检查错误的值-除非值是nil或与错误的值匹配,否则假定它为true。两种版本中的False值相同:
FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]
Rails 5来源:https : //github.com/rails/rails/blob/5-1-stable/activemodel/lib/active_model/type/boolean.rb
FALSE_VALUES
in Rails 的集合中也包含“ no”。
ActiveRecord::Type::Boolean::FALSE_VALUES << "no"
到初始化程序即可。
ActiveModel::Type::Boolean.new.cast(value)
是区分大小写的,因此'False'的计算结果为true,除'false'以外的其他任何字符串也将计算为true。空字符串''
默认为nil,而不是false。^^ @thomasfedb在此处提供有关初始化程序自定义的宝贵见解
ActiveModel::Type::Boolean.new.cast(nil)
也返回nil
。
ActiveRecord::Type::Boolean::FALSE_VALUES
冻结而不再起作用。
我经常使用这种模式来扩展Ruby的核心行为,从而使其更容易处理将任意数据类型转换为布尔值的情况,从而使处理各种URL参数等变得非常容易。
class String
def to_boolean
ActiveRecord::Type::Boolean.new.cast(self)
end
end
class NilClass
def to_boolean
false
end
end
class TrueClass
def to_boolean
true
end
def to_i
1
end
end
class FalseClass
def to_boolean
false
end
def to_i
0
end
end
class Integer
def to_boolean
to_s.to_boolean
end
end
因此,假设您有一个参数foo
,可以是:
您可以调用foo.to_boolean
而不是使用一堆附加条件,它将为您完成其余的工作。
在Rails中,我将其添加到core_ext.rb
几乎所有项目中都命名的初始化程序中,因为这种模式非常普遍。
## EXAMPLES
nil.to_boolean == false
true.to_boolean == true
false.to_boolean == false
0.to_boolean == false
1.to_boolean == true
99.to_boolean == true
"true".to_boolean == true
"foo".to_boolean == true
"false".to_boolean == false
"TRUE".to_boolean == true
"FALSE".to_boolean == false
"0".to_boolean == false
"1".to_boolean == true
true.to_i == 1
false.to_i == 0
"buy"=~/b/ => 0
但是("buy"=~/b/).to_boolean => false
不要想太多:
bool_or_string.to_s == "true"
所以,
"true".to_s == "true" #true
"false".to_s == "true" #false
true.to_s == "true" #true
false.to_s == "true" #false
如果您担心大写字母,也可以添加“ .downcase”。
nil.to_s == 'true' #false
if value.to_s == 'true'
true
elsif value.to_s == 'false'
false
end
value.to_s == 'true' ? true : false
if true then true, if false then false
猜怎么着?您可以将其完全删除!value.to_s == 'true' ? true : false
应该只是value.to_s == 'true'
在Rails 5.1应用程序中,我使用构建在上的核心扩展ActiveRecord::Type::Boolean
。当我从JSON字符串反序列化布尔值时,它对我来说是完美的。
https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html
# app/lib/core_extensions/string.rb
module CoreExtensions
module String
def to_bool
ActiveRecord::Type::Boolean.new.deserialize(downcase.strip)
end
end
end
初始化核心扩展
# config/initializers/core_extensions.rb
String.include CoreExtensions::String
规格
# spec/lib/core_extensions/string_spec.rb
describe CoreExtensions::String do
describe "#to_bool" do
%w[0 f F false FALSE False off OFF Off].each do |falsey_string|
it "converts #{falsey_string} to false" do
expect(falsey_string.to_bool).to eq(false)
end
end
end
end
在Rails中,我更喜欢使用ActiveModel::Type::Boolean.new.cast(value)
此处其他答案中提到的方法
但是当我写普通的Ruby lib时。然后,我会使用hack JSON.parse
(标准Ruby库)将字符串“ true”转换为true
和“ false”转换为false
。例如:
require 'json'
azure_cli_response = `az group exists --name derrentest` # => "true\n"
JSON.parse(azure_cli_response) # => true
azure_cli_response = `az group exists --name derrentesttt` # => "false\n"
JSON.parse(azure_cli_response) # => false
实时应用程序中的示例:
require 'json'
if JSON.parse(`az group exists --name derrentest`)
`az group create --name derrentest --location uksouth`
end
在Ruby 2.5.1中得到确认
在Rails中工作5
ActiveModel::Type::Boolean.new.cast('t') # => true
ActiveModel::Type::Boolean.new.cast('true') # => true
ActiveModel::Type::Boolean.new.cast(true) # => true
ActiveModel::Type::Boolean.new.cast('1') # => true
ActiveModel::Type::Boolean.new.cast('f') # => false
ActiveModel::Type::Boolean.new.cast('0') # => false
ActiveModel::Type::Boolean.new.cast('false') # => false
ActiveModel::Type::Boolean.new.cast(false) # => false
ActiveModel::Type::Boolean.new.cast(nil) # => nil
ActiveModel::Type::Boolean.new.cast("False") # => true
...在输入中使用to_s.downcase是个好主意
可以使用https://rubygems.org/gems/to_bool之类的gem ,但可以使用正则表达式或三进制轻松将其编写为一行。
正则表达式示例:
boolean = (var.to_s =~ /^true$/i) == 0
三元示例:
boolean = var.to_s.eql?('true') ? true : false
regex方法的优点在于,正则表达式非常灵活,可以匹配多种模式。例如,如果您怀疑var可以是“ True”,“ False”,“ T”,“ F”,“ t”或“ f”中的任何一个,则可以修改正则表达式:
boolean = (var.to_s =~ /^[Tt].*$/i) == 0
\A
/ \z
是字符串的开始/结尾,^
/ $
是行的开始/结尾。所以如果var == "true\nwhatevs"
那么boolean == true
。
var.eql?('true') ? true : false
非常喜欢。谢谢!
接近已发布的内容,但没有冗余参数:
class String
def true?
self.to_s.downcase == "true"
end
end
用法:
do_stuff = "true"
if do_stuff.true?
#do stuff
end
true
或false
抑或是不够的,如果结果是truthy或falsey?如果是后者,则false
是已经falsey,都true
和'true'
都truthy,所以其结果是不正确的话是唯一的价值'false'
:if input == 'false' then true else input end
应该这样做。