উটের কেসটিকে রুবিতে আন্ডারস্কোরের ক্ষেত্রে রূপান্তর করা


232

এমন কোনও প্রস্তুত কার্য আছে যা উটের ক্ষেত্রে স্ট্রিংসকে আন্ডারস্কোর দ্বারা পৃথক স্ট্রিংয়ে রূপান্তর করে?

আমি এরকম কিছু চাই:

"CamelCaseString".to_underscore      

"উট_সেস_ স্ট্রিং" ফিরতে

...


43
এফওয়াইআই: ছোট এবং আন্ডারকর্ড করা হয় "সরকারীভাবে" বলা হয় সাপের কেস
অ্যান্ড্রু

3
উদ্ধৃতি চিহ্নগুলিতে "আনুষ্ঠানিকভাবে" দেখা অবাক, এবং তবুও, এটি বর্ণনা করার সেরা উপায় way
স্টিভেনস্পিল

কিছু কারণে আমি স্নেককেস পদ্ধতিটি অনুপস্থিত দেখছি। 4
আব্রাম

উত্তর:


362

রেলগুলির অ্যাক্টিভসপোর্টটি নিম্নলিখিতটি ব্যবহার করে স্ট্রিংয়ের আন্ডারস্কোর যুক্ত করেছে:

class String
  def underscore
    self.gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr("-", "_").
    downcase
  end
end

তারপরে আপনি মজাদার জিনিসগুলি করতে পারেন:

"CamelCase".underscore
=> "camel_case"

5
আপনি পরিবর্তন করেন তাহলে tr("-","_")থেকে tr("- ","_")(প্রথম PARAM যোগ করা স্থান), এটি আন্ডারস্কোর মধ্যে শূণ্যস্থান চালু হবে। এছাড়াও, আমি মনে করি না যে আপনাকে অন্তর্ভুক্ত করা দরকার self., বা কমপক্ষে এটি আমার জন্য রুবি ১.৯.৩ এর অধীনে কাজ করে।
গাস শর্টজ

6
require 'active_support/core_ext/string'
কনসোলবক্স

আন্ডারস্কোর ফাংশন সক্রিয় ব্যবহারগুলি: github.com/rails/rails/blob/…
গ্রীক্যাট্রিনা

আন্ডারস্কোর পাগল পদ্ধতি নয় রুবি দেখতে apidock.com/rails/String/underscore
এস। যাদব

1
@ এস ইয়াদভ সত্য যে পদ্ধতিটি একটি রেলস তাই আপনি ডিফল্টরূপে আন্ডারস্কোরকে কল করতে পারবেন না, তবে ব্যবহৃত কোড সরবরাহ করে এবং রেলকে উত্স হিসাবে উদ্ধৃত করে এই উত্তরটি রুবির পক্ষে ভাল, এটি বলে যে আপনি রেলগুলি অন্তর্ভুক্ত করতে পারেন, বা ঠিক এই ফাংশনটি অন্তর্ভুক্ত করুন যা রেল দল লিখেছিল এবং পরীক্ষা করেছে।
মাইকেল গোরম্যান

99

তুমি ব্যবহার করতে পার

"CamelCasedName".tableize.singularize

বা শুধু

"CamelCasedName".underscore

উভয় বিকল্প উপায় ফলন করবে "camel_cased_name"। আপনি এখানে এটি আরও বিশদ পরীক্ষা করতে পারেন ।


11
এটি অ্যাক্টিভসপোর্টের একটি অংশ: ইনফ্লেক্টরের বাস্তবায়ন, এটি ব্যতীত আপনি সেই স্ট্রিং এক্সটেনশানগুলি ব্যবহার করতে পারবেন না (খাঁটি আইআরবি কনসোলটিতে চেষ্টা করুন: "এইসেমেলক্যাসস্ট্রিং"। বায়ারসিয়াস, তারপরে 'অ্যাক্টিভ_সপোর্ট / ইনফ্ল্যাক্টর' প্রয়োজন এবং আবার চেষ্টা করুন)
ইভজেনিয়া মানোলোভা

3
ওপির লেবেলটি "রুবি-অন-রেলস" বলে
জুলিয়েন লামারচে

55

ওয়ান-লাইনার রুবি বাস্তবায়ন:

class String
   # ruby mutation methods have the expectation to return self if a mutation occurred, nil otherwise. (see http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21)
   def to_underscore!
     gsub!(/(.)([A-Z])/,'\1_\2')
     downcase!
   end

   def to_underscore
     dup.tap { |s| s.to_underscore! }
   end
end

সুতরাং "SomeCamelCase".to_underscore # =>"some_camel_case"


2
অন্যান্য সমাধানগুলি খাঁটি রুবি নয় কীভাবে?
জুনিক্স 15

ওহ, শ ... ধন্যবাদ - লেখার চেয়ে লেখার প্রতি আমার আগ্রহ ছিল বেশি। ফলস্বরূপ - রেলের লিঙ্কগুলি আমাকে সেই অন্যান্য স্নিপকেটগুলি রেল-নির্দিষ্ট বলে মনে করেছে। উত্তর পরিবর্তিত হয়েছে ...
কিরুশিক

1
আমার সম্পাদনায় অন্য ত্রুটি রয়েছে, এবং এটি ঠিক করা যায় না বলে মনে হয়। এখানে সংশোধিত কোডটি দেওয়া হয়েছে: gist.github.com/4027440
টিম হার্পার

6
আপনি /([^A-Z])([A-Z]+)/পরিবর্তে "ALLCAPS"-> হ্যান্ডেল করার "allcaps"পরিবর্তে"a_ll_ca_ps"
Nevir

4
এটি আসলে একটি 10-লাইনার!
ক্রিশ্চিয়ানপ

30

'আন্ডারস্কোর' নামে একটি রেল ইনবিল্ট পদ্ধতি রয়েছে যা আপনি এই উদ্দেশ্যে ব্যবহার করতে পারেন

"CamelCaseString".underscore #=> "camel_case_string" 

'আন্ডারস্কোর' পদ্ধতিটি সাধারণত 'ক্যামিটাইজ' এর বিপরীত হিসাবে বিবেচিত হতে পারে


1
"..." এর জন্য অপরিজ্ঞাত পদ্ধতি `আন্ডারস্কোর ': স্ট্রিং
ডোরিয়ান

5
এটি একটি অ্যাক্টিভসপোর্ট পদ্ধতি
ডোরিয়ান

20

এখানে কিভাবে পাগল এটা আছে :

   def underscore(camel_cased_word)
     camel_cased_word.to_s.gsub(/::/, '/').
       gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
       gsub(/([a-z\d])([A-Z])/,'\1_\2').
       tr("-", "_").
       downcase
   end

1
কোর স্ট্রিং ক্লাসে আক্রমণ না করে পদ্ধতির আর্গুমেন্ট হিসাবে অপারেন্ড থাকা ভাল।
পিস্তোস

1
সম্মত হবেন না - এটি ক্লাসে যেমন চালানো উচিত ঠিক ততভাবে চালিত হওয়া ভাল, না হলে আপনাকে এটি একটি মডিউলে আটকে রাখতে হবে এবং যেখানে আপনার প্রয়োজন হবে সেখানে এটি অন্তর্ভুক্ত করতে ভুলবেন না।
ঘোটি

1
এছাড়াও এই পদ্ধতি পাগল 3 এর স্ট্রিং অংশ আসলে :)
Ghoti

2
যদি আমি এই বিতর্কে ঝাঁপিয়ে পড়তে পারি - আপনি যখন এটি অন্তর্ভুক্ত করবেন তখন স্ট্রিং ক্লাসে এটি আক্রমণ করা ভাল ))
ইভান মুরান

7

রিসিভার সাপের ক্ষেত্রে রূপান্তরিত: http://rubydoc.info/gems/extlib/0.9.15/ স্ট্রিং#snake_ کیس-ইনস্ট্যান্স_মোথডো

এটি ডেটা ম্যাপার এবং মার্বের জন্য সমর্থন লাইব্রেরি। ( http://rubygems.org/gems/extlib )

def snake_case
  return downcase if match(/\A[A-Z]+\z/)
  gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
  gsub(/([a-z])([A-Z])/, '\1_\2').
  downcase
end

"FooBar".snake_case           #=> "foo_bar"
"HeadlineCNNNews".snake_case  #=> "headline_cnn_news"
"CNN".snake_case              #=> "cnn"

7

রুবি ফেসটস থেকে স্নেককেস দেখুন

নিম্নলিখিত মামলাগুলি হ্যান্ডেল করা হয়, যা নীচে দেখানো হয়েছে:

"SnakeCase".snakecase         #=> "snake_case"
"Snake-Case".snakecase        #=> "snake_case"
"Snake Case".snakecase        #=> "snake_case"
"Snake  -  Case".snakecase    #=> "snake_case"

থেকে: https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb

class String

  # Underscore a string such that camelcase, dashes and spaces are
  # replaced by underscores. This is the reverse of {#camelcase},
  # albeit not an exact inverse.
  #
  #   "SnakeCase".snakecase         #=> "snake_case"
  #   "Snake-Case".snakecase        #=> "snake_case"
  #   "Snake Case".snakecase        #=> "snake_case"
  #   "Snake  -  Case".snakecase    #=> "snake_case"
  #
  # Note, this method no longer converts `::` to `/`, in that case
  # use the {#pathize} method instead.

  def snakecase
    #gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr('-', '_').
    gsub(/\s/, '_').
    gsub(/__+/, '_').
    downcase
  end

  #
  alias_method :underscore, :snakecase

  # TODO: Add *separators to #snakecase, like camelcase.

end

এটি বিশেষ চরিত্রের সাথে স্ট্রিংয়ের সাথে কাজ করে না। প্রাক্তন:"Dumb Penguin's Egg".snakecase # => "dumb_penguin's_egg"
খাইভ রেওয়াই

6

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

a = "Test String"
a.gsub(' ', '').underscore

  => "test_string"

1
underscore
রুবির

4

যদি কেস কেস খুঁজছেন যখন তাকে স্পেসগুলির সাথে স্ট্রিংয়ের জন্য আন্ডারস্কোর প্রয়োগ করতে হবে এবং সেগুলি আন্ডারস্কোরগুলিতে রূপান্তর করতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore

বা কেবল .parameterize ('_') ব্যবহার করুন তবে মনে রাখবেন যে এটি হ্রাস করা হয়েছে

'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore

1

আমি এটা চাইব:

class String

  # \n returns the capture group of "n" index
  def snikize
    self.gsub(/::/, '/')
    .gsub(/([a-z\d])([A-Z])/, "\1_\2")
    .downcase
  end

  # or

  def snikize
    self.gsub(/::/, '/')
    .gsub(/([a-z\d])([A-Z])/) do
      "#{$1}_#{$2}"
    end
    .downcase
  end

end

Stringবর্গ প্যাচ ক্লাস। বড় হাতের অক্ষরে দুটি বা ততোধিক অক্ষর দিয়ে শুরু এমন শ্রেণি রয়েছে।


"\1_\2"আপনাকে '\1_\2'অন্যথায় বদলাতে হবে অন্যথায় আপনি রুবি 2.5 এর "came\u0001_\u0002ase"পরিবর্তে শেষ করবেন "camel_case"... সম্ভবত অন্যরাও।
6ft ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.