programing

루비: 문자열을 부울로 변환하는 방법

stoneblock 2023. 6. 8. 19:15

루비: 문자열을 부울로 변환하는 방법

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::BooleanJSON 문자열에서 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