Kuangyou Yao
Kuangyou Yao

Reputation: 21

method undefined?

I am new to ruby. I tried to do a simple method(with parameter) call.

class MeowEncoder
    def method(c)
        puts c
        end
    end

print "please enter the thing you want"
s = gets.chomp()
MeowEncoder.method(s)

It is only passing parameter and prints it out. But the terminal keep giving me errors like

:MeowEncoder.rb:9: undefined method `toBinary' for MeowEncoder:Class (NoMethodError)

what is going on here?

I made some enhancement.

class MeowEncoder
        def encode(n)
            toBianry(?n)
            puts ""
        end

        def toBinary(n)
            if n < 2
                print n
            else
                toBinary(n / 2)
                print n % 2
            end
        end
    end

    o = MeowEncoder.new


    print "please enter the thing you want: "
    s = gets.chomp()
    s.each_char{|c| o.encode(c)} #this doesn't work
    o.toBinary(212)  # this works

I made some enhancement here. I try to convert a char to its ASCII value then to its binary form. I can made the single toBinary works. But the Encode method also gave me same error. What happened?

Upvotes: 0

Views: 193

Answers (4)

julie jan
julie jan

Reputation: 1

Book (title, author)
Author (pseudonym, first_name, last_name)
Book_catalog => collection of books
    methods
        add_book(book)
        remove_book(book)
        ​borrow_book(borrower, book)  => voeg boek toe aan borrower.books_borrowed
        return_book(borrower, book) => verwijder boek uit borrower.books_borrowed
        book_available?(book)
        search(title) => geeft gevonden book-object terug (anders nil)
Book_borrowing
    book (read-only), date_of_borrowing (read-only), date_of_return (read-only)
    borrow_book(book_to_borrow) : @date_of_borrowing = systeem-datum+uur
    return_book(book_to_return) : @date_of_return = systeem-datum+uur
Borrower
    member_nbr, first_name, last_name, books_borrowed = collection of Book_borrowing
    has_book_by_title(title) => geeft true of false terug
    has_book(book) => geeft true of false terug
Person(first_name, last_name)

Upvotes: 0

Rahul Tapali
Rahul Tapali

Reputation: 10147

Instead of each_char use each_byte and no need of encode method.

s.each_byte{|c| o.toBinary(c)}

Upvotes: 0

Cade
Cade

Reputation: 3181

To expand on Sergio's answer, if you actually wanted the method defined on the class, there are several ways to accomplish that, but the most straightforward is to prepend the method definition with self like so:

def self.method(c)
  puts c
end

That will allow you to invoke the method the way you are currently.

The reason this works is, in the context of defining the method, self is set to the MeowEncoder class. It's equivalent to saying:

def MeowEncoder.method(c)
  puts c
end

This is actually another valid way to declare class methods, but using self is better practice, as refactoring becomes easier if you ever change the name of your class.

Upvotes: 2

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230531

You defined an instance method, but you're trying to call it on a class object. Try this:

MeowEncoder.new.method(s)

Also, method is a bad name for a method. It will cause a name clash.

Upvotes: 5

Related Questions