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

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

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

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

Q&A

解決済

1回答

1302閲覧

オープンクラスの際の!メソッドの書き方

akamakku

総合スコア191

Ruby

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

0グッド

0クリップ

投稿2016/09/01 08:06

編集2016/09/01 08:08

Stringクラスにオープンクラスを使って(この表現は正しい?)、新しいメソッドを追加したいのですが、!メソッドを作るにはどのようにかけば良いんでしょうか?

Ruby

1def nextChar (c) 2 case c 3 when 'z' 4 ret = 'a' 5 when 'Z' 6 ret = 'A' 7 when ' ','.',',','?','!','_','{','}' 8 ret = c 9 else 10 ret = c.next 11 end 12 return ret 13end 14 15class String 16 def caesar (n) 17 res = String.new 18 self.chars.map{|c| 19 n.times do 20 c = nextChar c 21 end 22 res += c 23 } 24 return res 25 end 26 27 def caesar!(n) 28 res = String.new 29 self.chars.map{|c| 30 n.times do 31 c = nextChar c 32 end 33 res += c 34 } 35 self = res 36 return self 37 end 38end

とりあえず適当に書いてみたのですが案の定

Ruby

1self = res

のところで

Error

1Can't change the value of self

と言われてしまいます。

あと、もし質問に関係ないと怒られてしまったら質問し直すのですが、
Rubyの標準ライブラリのソースコードはどうすれば見られますか?
最初は適当なメソッドのソースコードを読んでみて、書き方を知ろうと思ったのですが、わからなくて質問することにしました。
環境はCentOS7です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

破壊的メソッドを作る場合は新しいインスタンスで置き換えるのではなく、self 自体を書き換える必要があります。

http://docs.ruby-lang.org/ja/2.3.0/class/String.html

self[nth] = val self[nth, len] = val などや xxx! などがありますので、これらを利用してみてください。

ちなみに破壊的メソッドがある場合の非破壊版を作る場合は、

ruby

1def caesar(n) 2 dup.caesar!(n) 3end

のようにするだけで大丈夫です。

投稿2016/09/01 08:27

thinca

総合スコア1864

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

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

akamakku

2016/09/01 08:43

回答ありがとうございます! とりあえず代入しておけばいいかなという考え方が間違っていました。。。 そして、Stringにこんなべんりな代入方法があったなんて知りませんでした。 dupも初めて知りました。 質問した以上のことを教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問