質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1492閲覧

添削のお願い

pe-ji

総合スコア17

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2015/09/01 06:58

title_caseという関数を作ります。
第一引数に文章を、第二引数に前置詞を書きます。(第二引数は任意)
文章は全てcapitalizeしますが、第二引数に書かれた前置詞は小文字にします。
ただし先頭の前置詞はcapitalizeします。
それで、こんな感じに書いてみたのですが、なにか汚い気がして、、、
添削していただけたら嬉しいです。宜しくお願いします。

ruby

1def title_case(title, minor_words = " ") 2 array = cap(title) 3 first = array[0] 4 m = cap(minor_words) 5 array.drop(1).map{|x| m.any?{|x2| x === x2 } === true ? x.downcase : x = x}.unshift(first).join(" ") 6end 7def cap(array) 8 array.split(" ").map{|x| x.capitalize} 9end 10 11title_case('THE WIND IN THE WILLOWS', 'The In') 12=> "The Wind in the Willows"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

先頭の単語の特別処理をどう書くか がポイントとおもいます。
以下では、先頭の単語、それ以降の単語で処理を分け、それぞれを要素とする配列るようにしてみました。
さらに nil がわたされたときの考慮もしてみました。

ruby

1def capitalize_message(message, preps = '') 2 return nil if message.nil? 3 words = message.downcase.split 4 return "" if words.size == 0 5 6 prs = "#{preps}".downcase.split 7 8 [words[0].capitalize, 9 words[1..-1].map {|w| prs.include?(w) ? w : w.capitalize } 10 ].flatten.join(' ') 11end 12 13p capitalize_message('THE WIND IN THE WILLOWS', 'The In') # => "The Wind in the Willows" 14p capitalize_message('the', '') # => "The" 15p capitalize_message('The', '') # => "The" 16p capitalize_message('THE', nil) # => "The" 17p capitalize_message('', "the") # => "" 18p capitalize_message(nil, nil) # => nil 19p capitalize_message('THE THE', "the") # => "The the"

投稿2015/09/01 14:16

編集2015/09/01 22:29
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pe-ji

2015/09/01 14:54

なるほど。goufさんは配列全体に判定を行い、最後に先頭をcapitalize化していましたが、 katoyさんは先頭の文字と残りの文字を分けて配列化し、それぞれに対して判定を行うのですね。さらにnilが渡されてた場合も考慮してあり、とてもいい答えだと思いました。ありがとうございます。 あと" "で区切る場合はsplitに引数を指定しなくてもいいんですね,,,参考になります。
katoy

2015/09/02 13:29

すこしだけ改良。 | ([words[0].capitalize!] + | words[1..-1].map! {|w| prs.include?(w) ? w : w.capitalize }).join(' ') として、配列がネストすることを避けたほうが良いと思いました。
guest

0

ベストアンサー

私だったらこう書く、程度のものですが:

  • 各引数をスペース区切りで配列に換える
  • 配列中の単語をキャピタライズ
  • 小文字化対象があれば変換
  • 先頭の単語をキャピタライズ

「一行に処理を詰め込み過ぎない」、「無理せず変数に値を保持させる」、といったこともだいじだとおもいます

ruby

1def title_case(words, target_minor_words = ' ') 2 minor_words = target_minor_words.split(' ') 3 4 capitalized_words = words.split(' ').map(&:capitalize) 5 capitalized_words.map! { |word| minor_words.include?(word) ? word.downcase : word } 6 7 capitalized_words[0] = capitalized_words.first.capitalize 8 9 capitalized_words.join(' ') 10end

(処理内容がおなじなので、行数もそんなに変わりないことが確認できると思います)

以上、なにか参考になれば幸いです

Link

投稿2015/09/01 08:42

gouf

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pe-ji

2015/09/01 12:25

any?ではなくinclude?, 最後に先頭の単語を変換、また処理を詰め込まないなどとても参考になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問