루비: 문자열을 부울로 변환하는 방법
boolean true, boolean false, 문자열 "true" 또는 문자열 "false" 중 하나가 되는 값이 있습니다.문자열인 경우 문자열을 부울로 변환하고, 그렇지 않으면 수정되지 않은 상태로 유지합니다.즉, 다음과 같습니다.
"참"이 참이 되어야 합니다.
"false"는 false가 되어야 합니다.
진실은 진실로 유지되어야 합니다.
거짓은 거짓으로 남아야 합니다.
레일 5를 사용하면 다음 작업을 수행할 수 있습니다.ActiveModel::Type::Boolean.new.cast(value)
.
4에서는 레 4.2서를 합니다.ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
.
레일 4.2에서와 같이 true 값과 false 값이 확인되므로 동작이 약간 다릅니다.레일 5에서는 거짓 값만 선택됩니다. 값이 0이거나 거짓 값과 일치하지 않는 한, 거짓 값이 참인 것으로 간주됩니다.은 두 모두 . FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]
레일 5 출처: https://github.com/rails/rails/blob/5-1-stable/activemodel/lib/active_model/type/boolean.rb
def true?(obj)
obj.to_s.downcase == "true"
end
저는 임의의 데이터 유형을 부울 값으로 변환하는 것을 쉽게 처리할 수 있도록 루비의 핵심 동작을 확장하기 위해 이 패턴을 자주 사용하여 다양한 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", "0", "1", "TRUE", "FALSE")
- 영의
에, 여조건사을대는신에하용다걸, 전수있습니를화그냥러▁call다있▁instead니▁just습수als,▁you걸▁can라고 부르면 됩니다.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
레일 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
너무 많이 생각하지 마세요.
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]
레일 5.1 앱에서 저는 위에 구축된 이 코어 확장을 사용합니다.ActiveRecord::Type::Boolean
JSON 문자열에서 boolean을 역직렬화하면 완벽하게 작동합니다.
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
선호하는 레일에서 사용하는 레일ActiveModel::Type::Boolean.new.cast(value)
여기에 있는 다른 답변에서 언급한 바와 같이
하지만 내가 평범한 루비 lib를 쓸 때는.그런 다음 나는 해킹을 사용합니다.JSON.parse
( 라이브러리는 문자열 를 (Ruby 라러는리이) "true"로 true
"false"는 "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에 따라 확인됨
https://rubygems.org/gems/to_bool 과 같은 보석을 사용할 수 있지만 정규식이나 3항식을 사용하여 한 줄로 쉽게 쓸 수 있습니다.
정규식 예제:
boolean = (var.to_s =~ /^true$/i) == 0
3차 예제:
boolean = var.to_s.eql?('true') ? true : false
정규식 방법의 장점은 정규식이 유연하고 다양한 패턴과 일치할 수 있다는 것입니다.예를 들어 var가 "True", "False", "T", "F", "t" 또는 "f"일 수 있다고 의심되는 경우 정규식을 수정할 수 있습니다.
boolean = (var.to_s =~ /^[Tt].*$/i) == 0
해시 접근 방식을 좋아하지만(예전에 비슷한 것에 사용한 적이 있습니다), 진실 값 일치에만 관심이 있다는 점을 고려하면 - 다른 모든 것은 거짓이기 때문에 - 배열에 포함되는지 확인할 수 있습니다.
value = [true, 'true'].include?(value)
또는 다른 값이 진실로 간주될 수 있는 경우:
value = [1, true, '1', 'true'].include?(value)
당신의 원래 모습이라면 다른 것들을 해야 할 것입니다.value
대/소문자가 혼합될 수 있습니다.
value = value.to_s.downcase == 'true'
그러나 문제에 대한 구체적인 설명을 위해서는 마지막 예제를 해결책으로 사용할 수 있습니다.
저는 이것에 대한 약간의 해킹이 있습니다. JSON.parse('false')
돌아올 것입니다false
그리고.JSON.parse('true')
true로 반환됩니다.하지만 이것은 작동하지 않습니다.JSON.parse(true || false)
그래서 이런 걸 사용하면.JSON.parse(your_value.to_s)
그것은 간단하지만 진부한 방식으로 당신의 목표를 달성해야 합니다.
Rubocop 제안 형식:
YOUR_VALUE.to_s.casecmp('true').zero?
https://www.rubydoc.info/gems/rubocop/0.42.0/RuboCop/Cop/Performance/Casecmp
레일에서는 이전에 다음과 같은 작업을 수행했습니다.
class ApplicationController < ActionController::Base
# ...
private def bool_from(value)
!!ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
end
helper_method :bool_from
# ...
end
데이터베이스의 레일과 동일한 방식으로 부울 문자열 비교를 일치시키려는 경우 유용합니다.
중복 매개 변수 없이 이미 게시된 내용에 가깝습니다.
class String
def true?
self.to_s.downcase == "true"
end
end
용도:
do_stuff = "true"
if do_stuff.true?
#do stuff
end
이 기능은 모든 입력에 대해 작동합니다.
def true?(value)
![false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"].include? value
end
그러면 다음과 같습니다.
true?(param) #returns true or false
당신은 그저 추가할 수 있습니다.!!
변수 앞:
!!test_string
언급URL : https://stackoverflow.com/questions/36228873/ruby-how-to-convert-a-string-to-boolean
'programing' 카테고리의 다른 글
텍스트 보기에서 링크를 클릭 가능하게 만드는 방법 (0) | 2023.06.08 |
---|---|
Firefox 브라우저에서 액세스할 때 현장 시간 데이터가 DB에 저장되지 않는 이유는 무엇입니까? (0) | 2023.06.08 |
파이썬에서 modb를 어떻게 계산합니까? (0) | 2023.06.08 |
C#으로 작성된 UTF-8 CSV 파일에는 Excel의 â 문자가 표시됩니다. (0) | 2023.06.08 |
ASP.NET 응용 프로그램이 웹 서비스에 연결할 수 있는 동시 연결 수를 제한하는 것은 무엇입니까? (0) | 2023.06.08 |