আমি সাপের কেস থেকে একটি নাম উটের ক্ষেত্রে রূপান্তরিত করার চেষ্টা করছি। কোন অন্তর্নির্মিত পদ্ধতি আছে?
যেমন: "app_user"থেকে"AppUser"
(আমার কাছে একটি স্ট্রিং রয়েছে যা "app_user"আমি এটিকে মডেলে রূপান্তর করতে চাই AppUser)।
আমি সাপের কেস থেকে একটি নাম উটের ক্ষেত্রে রূপান্তরিত করার চেষ্টা করছি। কোন অন্তর্নির্মিত পদ্ধতি আছে?
যেমন: "app_user"থেকে"AppUser"
(আমার কাছে একটি স্ট্রিং রয়েছে যা "app_user"আমি এটিকে মডেলে রূপান্তর করতে চাই AppUser)।
উত্তর:
আপনি যদি রেলগুলি ব্যবহার করেন তবে স্ট্রিং # ক্যামিটাইজ হ'ল আপনি যা খুঁজছেন তা।
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
আপনি যদি আসল ক্লাস পেতে চান তবে তার উপরে আপনার স্ট্রিং # কনস্ট্যান্টাইজ ব্যবহার করা উচিত ।
"app_user".camelize.constantize
ruby-on-rails, সুতরাং, আমার ধারণা, এটি কোনও সমস্যা নয়। তবে উল্লেখ করার জন্য ধন্যবাদ।
#classifyপরিবর্তে ব্যবহার করুন। "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"পর্যাপ্ত পরিমাণে সরবরাহ করা হচ্ছে, সরবরাহগুলি ইতিমধ্যে ইনস্টল করা আছে।
এটা কেমন?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
এখানে মন্তব্যে পাওয়া গেছে: একটি রুবি স্ট্রিংকে শ্রেণিবদ্ধ করুন
ওয়েন কনরাডের মন্তব্য দেখুন
আপনি যদি রেল ব্যবহার করেন তবে ব্যবহার করুন classify। এটি প্রান্তের কেসগুলি ভালভাবে পরিচালনা করে।
"app_user".classify # => AppUser
"user_links".classify # => UserLink
বিঃদ্রঃ:
এই উত্তরটি প্রশ্নের বর্ণনার সাথে সুনির্দিষ্ট (এটি প্রশ্নের শিরোনামের সাথে নির্দিষ্ট নয়)। যদি কেউ একটি স্ট্রিংকে উটের ক্ষেত্রে রূপান্তর করতে চাইছে তবে তাদের উচিত সার্জিওর উত্তরটি ব্যবহার করা উচিত । প্রশ্নকর্তা বলেছেন যে সে রূপান্তর app_userকরতে চায় AppUser(না App_user), সুতরাং এই উত্তরটি ..
classifyএকটি স্ট্রিং দেয়, আপনাকে constantizeএটির পরে একটি প্রকৃত শ্রেণিতে রূপান্তর করতে কল করতে হবে।
classify'age_in_years'.classifyAgeInYear
4.2.11
সূত্র: http://rubydoc.info/gems/extlib/0.9.15/ স্ট্রিং # ক্যামেল_কেস- ইনস্ট্যান্স_মোথড
শেখার উদ্দেশ্যে:
class String
def camel_case
return self if self !~ /_/ && self =~ /[A-Z]+.*/
split('_').map{|e| e.capitalize}.join
end
end
"foo_bar".camel_case #=> "FooBar"
এবং লোয়ারকেস ভেরিয়েন্টের জন্য:
class String
def camel_case_lower
self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
end
end
"foo_bar".camel_case_lower #=> "fooBar"
self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join
খাঁটি রুবি কোড দিয়ে এটি করার জন্য আমার মনে যে সমস্ত সম্ভাবনা ছিল আমি তা নিয়েছিলাম, সেগুলি এখানে:
মূলধন এবং gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}&শর্টহ্যান্ড ব্যবহার করে বিভক্ত এবং মানচিত্র ( ব্যবহারকারী 3869936 এর উত্তরের জন্য ধন্যবাদ)
'app_user'.split('_').map(&:capitalize).joinবিভক্ত এবং মানচিত্র (মিঃ ব্ল্যাক এর উত্তর ধন্যবাদ)
'app_user'.split('_').map{|e| e.capitalize}.joinএবং এইগুলির জন্য এখানে বেঞ্চমার্ক রয়েছে, আমরা দেখতে পাচ্ছি যে জিএসব এর জন্য বেশ খারাপ। আমি 126 080 শব্দ ব্যবহার করেছি।
user system total real
capitalize and gsub : 0.360000 0.000000 0.360000 ( 0.357472)
split and map, with &: 0.190000 0.000000 0.190000 ( 0.189493)
split and map : 0.170000 0.000000 0.170000 ( 0.171859)
আমি এখানে আপনার প্রশ্নের বিপরীত সন্ধান করছি, উটের ক্ষেত্রে থেকে সাপের ক্ষেত্রে যাচ্ছি to এর জন্য আন্ডারস্কোর ব্যবহার করুন (ডেসমেলাইজ করা হবে না):
AppUser.name.underscore # => "app_user"
বা, আপনার যদি ইতিমধ্যে একটি উটের কেস স্ট্রিং থাকে:
"AppUser".underscore # => "app_user"
বা, আপনি যদি টেবিলের নাম পেতে চান তবে সম্ভবত এই কারণেই আপনি সাপের ঘটনাটি চান:
AppUser.name.tableize # => "app_users"
AppUser.table_name? আপনি যদি অ্যাপ_উজারস না হন তবে সত্যিকারের টেবিলের নামটি অন্য কোথাও সংজ্ঞায়িত করাও নিশ্চিত করবেন।
এখানে আরও উত্তর যুক্ত করতে আমি কিছুটা অস্বস্তি বোধ করছি। @ ইউলিসি-বিএন থেকে সুন্দর মানদণ্ডকে উপেক্ষা করে সর্বাধিক পঠনযোগ্য এবং নূন্যতম খাঁটি রুবি পদ্ধতির দিকে যাওয়ার সিদ্ধান্ত নিয়েছে। যদিও :classমোড @ user3869936 একটি অনুলিপি, :methodমোড আমি অন্য কোন উত্তর এখানে দেখতে পাচ্ছি না।
def snake_to_camel_case(str, mode: :class)
case mode
when :class
str.split('_').map(&:capitalize).join
when :method
str.split('_').inject { |m, p| m + p.capitalize }
else
raise "unknown mode #{mode.inspect}"
end
end
ফলাফলটি হ'ল:
[28] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :class)
=> "AsdDsaFds"
[29] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :method)
=> "asdDsaFds"
PascalCaseএকটি সাবসেট CamelCase। এছাড়াও এটি আমি জানতাম - উটের মামলাটি উভয়ের ক্ষেত্রেই প্রযোজ্য। তবে আমি কখনও তদন্ত করিনি। যদিও পাস্কেলকেস উল্লেখ করার জন্য ধন্যবাদ। en.wikipedia.org/wiki/Camel_case
:methodসংস্করণ একটি করেনি downcaseপ্রথম তাই এটি উভয় ব্যবহার করা যেতে পারে lower_snake_caseএবং UPPER_SNAKE_CASE।
এখানে তালিকাভুক্ত অন্যান্য পদ্ধতিগুলির বেশিরভাগই রেয়েল নির্দিষ্ট। আপনি যদি খাঁটি রুবির সাথে এটি করতে চান তবে নীচেরটি হ'ল আমি সর্বাধিক সংক্ষিপ্ত ভাবে এলাম (প্রস্তাবিত উন্নতির জন্য @ ইউলিসি-বিএনকে ধন্যবাদ জানাই)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsubসমাধানে ফিরে এসেছি বলে মনে হচ্ছে এটি mapসমাধানের তুলনায় ধীর is
খাঁটি রুবিতে আপনি রেলগুলি থেকে সঠিক কোড ব্যবহার করে স্ট্রিং ক্লাস প্রসারিত করতে পারেন .camelize
class String
def camelize(uppercase_first_letter = true)
string = self
if uppercase_first_letter
string = string.sub(/^[a-z\d]*/) { |match| match.capitalize }
else
string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
end
string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub("/", "::")
end
end