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

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

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

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

Q&A

解決済

1回答

1979閲覧

NoMethodErrorと出てしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2016/10/18 05:05

編集2016/10/18 05:07

###前提・実現したいこと

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.

英小文字ならば(219 - 文字コード)の文字に置換 その他の文字はそのまま出力

この関数を用い,英語のメッセージを暗号化・復号化せよ.

http://www.cl.ecei.tohoku.ac.jp/nlp100/こちらのサイトの問題です。

###発生している問題・エラーメッセージ

08.rb:4:in `cipher': undefined method `each' for "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.":String (NoMethodError) from 08.rb:13:in `<main>'

###該当のソースコード

str = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." def cipher(input) ret = "" for char in input if char == char.downcase ret += chr(219-ord(char)) else ret += char end end end str = cipher(str) print str

###試したこと
文字列と配列がごっちゃになっているのかと思い、strを1文字ずつ分けて配列にしてみたりした。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:ruby2.0.0
OS:Windows
シェル:Rumix2
エディタ:Notepad++

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

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

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

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

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

guest

回答1

0

ベストアンサー

このような時は、文字列を一度配列にしてから、処理を行うと良いでしょう。
あとRubyではforよりもeachメソッドを好んで使うことが多いです。
しかし、今回の場合はeach_charで1文字ずつ取り出すことができます。

ruby

1str = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." 2def cipher(input) 3 ret = "" 4 input.each_char do |char| 5 if char == char.downcase 6 ret += chr(219-ord(char)) 7 else 8 ret += char 9 end 10 end 11end 12 13str = cipher(str) 14print str

投稿2016/10/18 05:17

編集2016/10/18 10:21
cameluby

総合スコア891

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

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

退会済みユーザー

退会済みユーザー

2016/10/18 05:32

回答ありがとうございます。早速試してみました。 endが一つ多いと思ったので1つ消して実行しましたが以下のエラーが出てしまいました。 08.rb:6:in `block in cipher': undefined method `ord' for main:Object (NoMethodEr ror) from 08.rb:4:in `each_char' from 08.rb:4:in `cipher' from 08.rb:14:in `<main>'
cameluby

2016/10/18 10:22 編集

そうですね、endが一つ多かったです。 訂正します。 ret += chr(219-ord(char)) のordメソッドが無いと思うのですが、これは定義されてますか? 答え自体はこちらの08になると思うので、もし良かったら参考にしてみてください。 http://qiita.com/modal_soul/items/0578b368cf332787e61b
退会済みユーザー

退会済みユーザー

2016/10/18 11:44

>>ret += chr(219-ord(char)) のordメソッドが無いと思うのですが、これは定義されてますか? ordメソッドの定義というのは自分で def ord ○○○○○ end で定義するということですか? 初歩的な質問でお時間取らせてしまい申し訳ありません。 ありがとうございます。ぜひ参考にさせていただきます。
cameluby

2016/10/18 11:47

はい、自分で定義しているなど、そのメソッドが使える状態であるか?という意味でした。 いえいえ。大丈夫ですよ! また気軽に質問してください。
退会済みユーザー

退会済みユーザー

2016/10/18 11:57

rubyリファレンスのサイトを見ると str.ord ordメソッドは、文字列の最初の文字のコードポイントを返します。コードポイントとは、1文字を表す整数のコードです。 http://ref.xaio.jp/ruby/classes/string/ord と書いてあるのでordメソッドは定義してなくても使えるんじゃないの?という疑問が生まれたのですが...もしかして .ord ord(変数名) という2つのメソッド?は同じではないのでしょうか? 今までずっとイコールと考えていたのですが... 新しいことを始めると初めは疑問しか生まれないなと実感しています(笑)
cameluby

2016/10/18 12:04

はい、ordメソッドはStringクラスのオブジェクトに対しては使用できます。 変数名.ord と ord(変数名) は、別物なのです。 > undefined method `ord' for main:Object (NoMethodEr とエラーが出ているのは、つまりこのようなことになっているのです。 main:Object.ord(char) しかし、main:Objectはordメソッドを持っていないので、エラーになります。 ここでは、charがordメソッドを持っているので、 char.ord が意図した動きになるでしょう。 最初は難しいですが、オブジェクト指向なども少しずつ学んで行くと、理解が深まると思いますよ!
退会済みユーザー

退会済みユーザー

2016/10/18 13:27

なんとなく自分が次に調べるべきことが分かった気がします! ありがとうございます。 また調べて分からないことがあったら質問させていただきたいと思います。 自分で解決することが出来たら自己解決という形でこの質問を締め切らせていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問