[ruby] Ruby : 문자열을 부울로 변환하는 방법
boolean true, boolean false, 문자열 “true”또는 문자열 “false”중 하나가 될 값이 있습니다. 문자열이면 부울로 변환하고, 그렇지 않으면 수정하지 않은 상태로 둡니다. 다시 말해:
“true”는 true가되어야합니다.
“false”는 false가되어야합니다.
사실은 사실이어야한다
거짓은 거짓이어야한다
답변
def true?(obj)
obj.to_s.downcase == "true"
end
답변
Rails 5를 사용한다면 ActiveModel::Type::Boolean.new.cast(value)
.
Rails 4.2에서는 ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
.
동작은 Rails 4.2에서와 같이 참 값과 거짓 값이 확인되므로 약간 다릅니다. Rails 5에서는 거짓 값만 검사합니다. 값이 nil이거나 거짓 값과 일치하지 않는 한 참으로 간주됩니다. 거짓 값은 두 버전에서 동일합니다.
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
답변
이 패턴을 자주 사용하여 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
.
- 정수 (0은 거짓, 나머지는 모두 참)
- 참 부울 (true / false)
- 문자열 ( “true”, “false”, “0”, “1”, “TRUE”, “FALSE”)
- 무
여러 조건문을 사용하는 대신 호출 만하면 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
답변
너무 많이 생각하지 마십시오.
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”를 추가 할 수도 있습니다.
답변
if value.to_s == 'true'
true
elsif value.to_s == 'false'
false
end
답변
h = { "true"=>true, true=>true, "false"=>false, false=>false }
["true", true, "false", false].map { |e| h[e] }
#=> [true, true, false, false]
답변
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
rspec
# 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