রুবি: কীভাবে একটি স্ট্রিংকে বুলিয়ান রূপান্তর করতে হয়


107

আমার একটি মান রয়েছে যা চারটি জিনিসের মধ্যে একটি হবে: বুলিয়ান সত্য, বুলিয়ান মিথ্যা, স্ট্রিং "ট্রু" বা স্ট্রিং "ভুয়া"। আমি স্ট্রিংটি একটি বুলিয়ান রূপান্তর করতে চাই যদি এটি স্ট্রিং হয়, অন্যথায় এটিকে বিনা সংশোধন করে ছেড়ে দিন। অন্য কথায়:

"সত্য" সত্য হওয়া উচিত

"মিথ্যা" মিথ্যা হয়ে উঠতে হবে

সত্য সত্য হওয়া উচিত

মিথ্যা মিথ্যা থাকা উচিত


2
ফলাফলের দেয় আছে দুইটি মানের এক হতে trueবা falseবা এটা যথেষ্ট যদি ফলাফলের truthy বা falsey হয়? আধুনিক, তাহলে falseইতিমধ্যে falsey, এবং উভয় trueএবং 'true', truthy রয়েছে, তাই শুধুমাত্র যে মানের জন্য ফলাফলের ইতিমধ্যে সঠিক নয়, হয় 'false': if input == 'false' then true else input endএটা করতে হবে।
Jörg ডব্লু মিট্টাগ

এটি একটি দুর্দান্ত মন্তব্য জর্গ, তবে আমি ধরে নেব যে কিছু অ্যাপ্লিকেশনগুলির জন্য বুলিয়ান মানটি সত্য বা মিথ্যা এবং সত্য যে মিথ্যা নয় কেবল তা নয়।
এমেরি 26'16

2
সিরিশ, যদি আপনি একটি বুলিয়ান আপনি দুই "নাস্তিমান" সঙ্গে @ Jörg এর অভিব্যক্তি পূর্বে লিখুন পারে ফেরত দিতে প্রয়োজন: !!(if input == 'false' then true else input end)। দ্বিতীয়টি !রিটার্নের মানটিকে একটি বুলিয়ানকে রূপান্তর করে যা আপনি যা চান তার বিপরীত হয়; প্রথমটি !তখন সংশোধন করে। এই "কৌশল" প্রায় দীর্ঘ সময় হয়েছে been সবাই এর খুব পছন্দ করে না।
ক্যারি সোভেল্যান্ড

উত্তর:


126
def true?(obj)
  obj.to_s.downcase == "true"
end

3
হ্যাঁ, @ নুল, টো_স পদ্ধতিটি বুলিয়ানকে সত্য বা মিথ্যাটিকে "সত্য" বা "মিথ্যা" রূপান্তর করে এবং মূলত একটি স্ট্রিং হলে মানটি অপরিবর্তিত রাখে। এখন আমাদের কাছে "স্ট্রিং" হিসাবে "সত্য" বা "মিথ্যা" অবশ্যই আছে ... এবং আমাদের কেবল স্ট্রিংটি "সত্য" এর সমান কিনা তা পরীক্ষা করতে হবে == ব্যবহার করা দরকার। যদি তা হয় তবে মূল মানটি হয় সত্য বা "সত্য"। যদি এটি না হয় তবে আসল মানটি ছিল মিথ্যা, "মিথ্যা", বা সম্পূর্ণ সম্পর্কিত নয় something
এমেরি

8
যেহেতু স্ট্রিংটি উপকৃত / শিরোনামযুক্ত হতে পারে, তাই ডাউনসেসিং একটি ম্যাচ নিশ্চিত করবে:obj.to_s.downcase == 'true'
টিডিএইচ

1
ব্যবহার করুন downcase!এবং আপনার 1 টি কম অবজেক্ট বরাদ্দ হবে। downcaseবিদ্যমান স্ট্রিংয়ের সদৃশ হবে। যখন হিমায়িত স্ট্রিং লিটারালগুলি একটি রুবি ডিফল্ট বিকল্পে পরিণত হয়, এটি কম বিবেচ্য হবে।
ড্যানিয়েলিকেরকোডস

ডাউনসকেস এর পরামর্শ অন্তর্ভুক্ত করার জন্য আমি উত্তর সম্পাদনা করার স্বাধীনতা নিয়েছি! উপরের মতামত অনুসারে এটি পড়তে কম মার্জিত, তবে আপনি কী পরিবর্তনশীল প্রকারের সাথে কাজ করছেন তা নিশ্চিত না হলে আরও দৃ rob়তা কখনই খারাপ হয় না।
এমেরি

আপনি যদি এটির খারাপ ডেটা খাওয়ান তবে এটি কোনও ত্রুটির কথা জানায় না, তাই আপনার যদি কোনও ত্রুটি পরিচালনার প্রয়োজন হয় তবে এটি দুর্দান্ত সমাধান নয়
টবি 1 কেনবি

118

আপনি যদি রেল 5 ব্যবহার করেন তবে আপনি এটি করতে পারেন ActiveModel::Type::Boolean.new.cast(value)

4.2 রেলগুলিতে, ব্যবহার করুন ActiveRecord::Type::Boolean.new.type_cast_from_user(value)

আচরণটি কিছুটা আলাদা, R.২ রেলের মতোই, সত্য মান এবং ভুয়া মানগুলি পরীক্ষা করা হয়। 5 রেলগুলিতে, কেবলমাত্র ভুয়া মানগুলি পরীক্ষা করা হয় - মানগুলি শূন্য না হলে বা কোনও ভুয়া মানটির সাথে মেলে না, এটি সত্য বলে ধরে নেওয়া হয়। উভয় সংস্করণে ভুয়া মান একই: 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


1
আমি আশা করি যে যদিও সেট এই সহায়ক FALSE_VALUESপাগল মধ্যে অন্তর্ভুক্ত "না"।
pjrebsch

3
@pjrebsch আপনার অ্যাপ্লিকেশনটিতে প্যাচ করা মোটামুটি সহজ। শুধু ActiveRecord::Type::Boolean::FALSE_VALUES << "no"একটি ইনিশিয়ালাইজারে যুক্ত করুন।
thomasfedb

নোট যেটি ActiveModel::Type::Boolean.new.cast(value)সংবেদনশীল ... সুতরাং 'মিথ্যা' সত্য হিসাবে মূল্যায়ন করবে যেমন 'মিথ্যা' ব্যতীত অন্য কোনও স্ট্রিং। খালি স্ট্রিং ''শূন্য করতে ডিফল্ট, মিথ্যা নয়। initial প্রাথমিক
স্তরের

1
ActiveModel::Type::Boolean.new.cast(nil)এছাড়াও ফিরে nil
নিকোলে ডি

1
5.3.4 রেলগুলি অনুসারে @ থমাসফিডব দ্বারা প্রস্তাবিত পদ্ধতিটি ActiveRecord::Type::Boolean::FALSE_VALUESহিমায়িত হওয়ার কারণে আর কাজ করে না ।
মুভসন

24

আমি প্রায়শই এই প্যাটার্নটি রুবির মূল আচরণটি প্রসারিত করতে ব্যবহার করেছি যাতে বুলেয়ান মানগুলিতে স্বেচ্ছাচারিত উপাত্তের ধরণের রূপান্তরকে আরও সহজ করা যায় যা বিভিন্ন ইউআরএল পরামিতি ইত্যাদির সাথে মোকাবিলা করা সত্যিই সহজ করে তোলে etc.

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 টি মিথ্যা, অন্য সমস্ত সত্য)
  • একটি সত্য বুলিয়ান (সত্য / মিথ্যা)
  • একটি স্ট্রিং ("সত্য", "মিথ্যা", "0", "1", "সত্য", "মিথ্যা")
  • শূন্য

একগুচ্ছ শর্তসাপেক্ষ ব্যবহার করার পরিবর্তে, আপনি কেবল কল করতে পারেন foo.to_booleanএবং এটি আপনার জন্য বাকি যাদুটি করবে।

রেলগুলিতে, আমি 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
মার্কোস

23

খুব বেশি চিন্তা করবেন না:

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

আপনি যদি বড় হাতের অক্ষর সম্পর্কে উদ্বিগ্ন হন তবে আপনি ".ডেস্কস" যুক্ত করতে পারেন।


5
nil.to_s == 'true' #false
জুলিয়ানগনজালেজ

15
if value.to_s == 'true'
  true
elsif value.to_s == 'false'
  false
end

10
ওয়ান-লাইনার হিসাবে আপনার কোডvalue.to_s == 'true' ? true : false
সাগর পান্ড্যা

20
@ সাগরপাণ্ড্য ৮২: কখনও তা করবেন না, এটি শর্তসাপেক্ষ অপারেটরের উদ্দেশ্যকে পরাস্ত করে: if true then true, if false then falseঅনুমান কী? আপনি এটি সম্পূর্ণরূপে অপসারণ করতে পারেন! value.to_s == 'true' ? true : falseসবেমাত্র হওয়া উচিতvalue.to_s == 'true'
এরিক ডুমিনিল

4
@ এরিকডুমিনিল একেবারে সম্মত হন, সেই সময়কার ছদ্মবেশী ত্রুটি।
সাগর পান্ড্য

2
মনে রাখবেন যে উত্তরটি রূপান্তরিত করতে না পারলে এই উত্তরটি শীঘ্রই ফিরে আসবে যখন one ওয়ান-লাইনারগুলি কখনই ব্যর্থ হয় না এবং মানটি 'সত্য' না হলে সর্বদা মিথ্যা ফিরিয়ে দেয়। উভয়ই বৈধ পন্থা এবং বিভিন্ন পরিস্থিতিতে সঠিক উত্তর হতে পারে, তবে সেগুলি এক নয়।
দুদাদ

1
@ এন্ড্রেফিগুয়েরেডো টের্নারি অপারেটর এক্ষেত্রে কিছুই করেন না। ছাড়াই চেষ্টা করুন, এবং ফলাফলগুলি তুলনা করুন।
এরিক ডুমিনিল


7

একটি রেল 5.1 অ্যাপে, আমি উপরে নির্মিত এই মূল এক্সটেনশনটি ব্যবহার করি ActiveRecord::Type::Boolean। আমি যখন জেএসএন স্ট্রিং থেকে বুলিয়ানকে ডিজিজালাইজ করি তখন এটি আমার পক্ষে পুরোপুরি কাজ করে working

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

এটি নিখুঁত। ঠিক আমি খুঁজছেন ছিল কি.
ডগ

5

রেলগুলিতে আমি ActiveModel::Type::Boolean.new.cast(value)এখানে অন্যান্য উত্তরে উল্লিখিত হিসাবে ব্যবহার করা পছন্দ করি

তবে আমি যখন সরল রুবি লিবি লিখি। তারপরে আমি একটি হ্যাক ব্যবহার করি যেখানে JSON.parse(মানক রুবি গ্রন্থাগার) স্ট্রিংটিকে "সত্য" trueএবং "মিথ্যা" তে রূপান্তর করবে 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

রুবি 2.5.1.1 এর অধীনে নিশ্চিত করা হয়েছে


5

কারাগারে কাজ 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

1
ActiveModel::Type::Boolean.new.cast("False") # => true... আপনার ইনপুটটিতে to_s.downcase ব্যবহার করা ভাল ধারণা
রাফায়ল

4

আমি এই এক জন্য একটু হ্যাক আছে। JSON.parse('false')ফিরে আসবে falseএবং JSON.parse('true')সত্য ফিরে আসবে। তবে এটি কাজ করে না JSON.parse(true || false)। সুতরাং, আপনি যদি এমন কিছু ব্যবহার করেন তবে JSON.parse(your_value.to_s)এটি আপনার লক্ষ্যটি সহজ তবে হ্যাকি উপায়ে অর্জন করা উচিত।


3

Https://rubygems.org/gems/to_bool এর মতো একটি রত্ন ব্যবহার করা যেতে পারে তবে এটি একটি রেজেক্স বা টের্নারি ব্যবহার করে সহজেই একটি লাইনে লেখা যায়।

রেজেক্স উদাহরণ:

boolean = (var.to_s =~ /^true$/i) == 0

তিনটি উদাহরণ:

boolean = var.to_s.eql?('true') ? true : false

রেজেক্স পদ্ধতির সুবিধা হ'ল নিয়মিত প্রকাশগুলি নমনীয় এবং বিভিন্ন ধরণের নিদর্শনগুলির সাথে মেলে। উদাহরণস্বরূপ, যদি আপনি সন্দেহ করেন যে ভের কোনও "সত্য", "মিথ্যা", 'টি', 'এফ', 'টি', বা 'চ' এর হতে পারে তবে আপনি রেজেক্সটি সংশোধন করতে পারেন:

boolean = (var.to_s =~ /^[Tt].*$/i) == 0

2
দ্রষ্টব্য: \A/ \z স্ট্রিংয়ের ^/ স্টার্টের শেষ এবং / $হল লাইনের শেষ / শেষ। তাই আপনি যদি var == "true\nwhatevs"তারপর boolean == true
cremno

এটি সত্যই আমাকে সাহায্য করেছে এবং আমি var.eql?('true') ? true : falseখুব পছন্দ করি । ধন্যবাদ!
খ্রিস্টান

3

যদিও আমি হ্যাশ পদ্ধতির পছন্দ করি (আমি এটি অতীতে একই ধরণের জিনিসগুলির জন্য ব্যবহার করেছি), আপনি কেবল সত্যবাদী মানগুলির সাথে মিল রেখেই যত্নবান হন - যেহেতু - সমস্ত কিছুই মিথ্যা - আপনি অ্যারেতে অন্তর্ভুক্তির জন্য যাচাই করতে পারেন:

value = [true, 'true'].include?(value)

অথবা যদি অন্য মানগুলি সত্য বলে বিবেচিত হতে পারে:

value = [1, true, '1', 'true'].include?(value)

যদি আপনার মূল valueমিশ্রিত কেস হতে পারে তবে আপনাকে অন্যান্য জিনিসগুলি করতে হবে:

value = value.to_s.downcase == 'true'

তবে আবার, আপনার সমস্যার নির্দিষ্ট বর্ণনার জন্য, আপনি আপনার সমাধান হিসাবে শেষের উদাহরণটি দিয়ে পালাতে পারেন।


2

রেলপথে, আমি এর আগেও এরকম কিছু করেছি:

class ApplicationController < ActionController::Base
  # ...

  private def bool_from(value)
    !!ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  end
  helper_method :bool_from

  # ...
end

আপনি যদি আপনার বুলিয়ান স্ট্রিংগুলির সাথে একইভাবে আপনার ডাটাবেসের জন্য রেলগুলির সাথে তুলনা করার চেষ্টা করতে চান তবে খুব ভাল।


0

ইতিমধ্যে যা পোস্ট করা হয়েছে তার নিকটে, তবে অতিরিক্ত বাজনাম ছাড়াই:

class String
    def true?
        self.to_s.downcase == "true"
    end
end

ব্যবহার:

do_stuff = "true"

if do_stuff.true?
    #do stuff
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.