Yanıtlar:
Rails kullanıyorsanız, String # camelize aradığınız şeydir.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Gerçek bir sınıf almak istiyorsanız , bunun üstünde String # constantize kullanmalısınız .
"app_user".camelize.constantize
ruby-on-rails
, bu yüzden sanırım sorun değil. Ama bahsettiğiniz için teşekkürler.
#classify
Bunun yerine kullanın . "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
önceden kurulmuş olması koşuluyla yeterlidir.
Buna ne dersin?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
Buradaki yorumlarda bulundu: Bir Ruby dizesini sınıflandırın
Yoruma bakın Wayne Conrad
Rails kullanıyorsanız, kullanın classify
. Kenar kasalarını iyi idare eder.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Not:
Bu cevap soruda verilen açıklamaya özgüdür (soru başlığına özgü değildir). Eğer bir ipi deveye çevirmeye çalışıyorsa Sergio'nun cevabını kullanmalıdırlar. O dönüştürmek istediği sorgulayıcı devletler app_user
için AppUser
(değil App_user
), dolayısıyla bu cevabı ..
classify
Bir dize döndürdüğünü unutmayın, constantize
daha sonra gerçek bir sınıfa dönüştürmek için çağırmanız gerekir.
classify
, çoğullaştırılmış dizelerin tekil 'age_in_years'.classify
hale AgeInYear
4.2.11
Kaynak: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Öğrenme amacıyla:
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"
Ve lowerCase varyantı için:
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
Saf yakut koduyla bunu yapmak için aklımdaki tüm olasılıkları aldım, işte bunlar:
büyük harf ve büyük harf
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
&
steno kullanarak böl ve eşleştir (user3869936'un cevabı sayesinde)
'app_user'.split('_').map(&:capitalize).join
bölün ve haritalayın (Bay Black'in cevabı sayesinde)
'app_user'.split('_').map{|e| e.capitalize}.join
İşte tüm bunlar için Benchmark, gsub'ın bunun için oldukça kötü olduğunu görebiliyoruz. 126 080 kelime kullandım.
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)
Buraya, sorunuzun tersini aramaya başladım, deve kasasından yılan kasasına. Bunun için alt çizgi kullanın (decamelize değil):
AppUser.name.underscore # => "app_user"
veya zaten bir deve kılıfı dizeniz varsa:
"AppUser".underscore # => "app_user"
veya tablo adını almak istiyorsanız, büyük olasılıkla yılan kasasını istersiniz:
AppUser.name.tableize # => "app_users"
AppUser.table_name
? Ayrıca, app_users değil, başka bir yerde tanımlanmış bir şeyse gerçek tablo adına sahip olmanız gerekir.
Buraya daha fazla cevap eklemek biraz huzursuz hissediyorum. @ Ulysse-bn'den güzel ölçütü göz ardı ederek en okunabilir ve minimal saf yakut yaklaşımına karar verdi. İken :class
mod @ user3869936 bir kopyasıdır, :method
mod burada başka yanıtında görmüyorum.
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
Sonuç:
[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
bir alt kümesidir CamelCase
. Ayrıca bildiğim de buydu - deve davası her ikisine de uygulandı. Ama hiç araştırmadım. Yine de PascalCase'den bahsettiğiniz için teşekkürler. en.wikipedia.org/wiki/Camel_case
:method
sürümü yaptılar downcase
hem kullanılabilir, böylece ilk lower_snake_case
ve UPPER_SNAKE_CASE
.
Burada listelenen diğer yöntemlerin çoğu Raylara özgüdür. Bunu saf Ruby ile yapmak istiyorsanız, aşağıda ortaya koyduğum en özlü yol (önerilen iyileştirme için @ ulysse-bn sayesinde)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
çözümünüze geri dönüyoruz, ki bu map
çözümle karşılaştırıldığında daha yavaş görünüyor .
Pure Ruby'de, dize sınıfını Rails ile aynı kodu kullanarak genişletebilirsiniz .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