특정 멤버로 특정 객체를 얻을 수 있을까?

Tags:

In response to 특정 멤버로 특정 객체를 얻을 수 있을까?

당연히 루비에선 쉽게 됩니다. ㅎㅎ

class Foo
    def initialize(name)
        @name = name
    end
    
    def print_name
        puts @name
    end
end

def bar(f)
    f.print_name
end

# Now, I want to add list functionality
module List
    attr_accessor :prev, :next
end

# I can change Foo whenever!
class Foo
    include List
end

f = Foo.new("test")

# Foo responds to 'print_name' message.
bar(f)
f.next = Foo.new("test2")

# Foo responds to 'next' message also.
bar(f.next)

결과는
test
test2

C++에서 메타프로그래밍으로 해결할 수는 있겠지만 쉽진 않겠죠. (30분~1시간 생각해봐야할 듯.) 자바나 C#에서 될지는 저도 잘;

Comments

4 responses to “특정 멤버로 특정 객체를 얻을 수 있을까?”

  1. 공성식 Avatar
    공성식

    음… 상당히 묘한 느낌을 주는 케이스네요.
    C의 구현 방식에 맞추기 위해 루비를 downgrade한 느낌이랄까요.
    C에는 dynamic array가 없기 때문에 그에 대한 대안으로 linked list를 사용하는데,
    루비로 억지로 linked list를 구현한 것 같은… (물론 루비도 내부적으로야 linked list를 이용했겠지만요)

    원래 질문하신 분은 C의 포인터가 타입에 구애받지 않고 사용될 수 있다는 점을 다른 언어에 적용하고 싶어하신 모양입니다.
    C#에서의 포인터는 대안으로는 부적합할 것 같구요(unsafe 구문 밖에서는 오브젝트의 주소가 동적이라 포인터가 곧 쓸모없어지죠.)
    오히려 프로그래머의 패러다임을 바꾸는 게 맞지 않을런지요.
    Object 타입을 원소로 하는 리스트를 사용하거나 generics가 맞을 것 같습니다.

    (제가 질문을 잘 이해 못한 건지도 모르겠습니다.)

  2. MKSeo Avatar
    MKSeo

    C# 도 잘하시는 rubyist시군요. ㅎㅎ
    물론 루비에서는 linked list가 필요가 없죠.. {} 하나면 되니까.
    문제의 의도에 충실하게 해본 것입니다.

    저도 같은 상황이면 generics를 쓰고 vector에 data를 넣게 구현할 듯.

  3. 공성식 Avatar
    공성식

    엥? {}요? [] 겠죠. ㅎㅎ

  4. MKSeo Avatar
    MKSeo

    넹 ㅠ.ㅜ []

Leave a Reply

Your email address will not be published. Required fields are marked *