[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