Ruby에서 eval의 정확한 역할이 뭔가요? 그리고 쓰면 안좋다는데 정말 그런가요?

조회수 1839회

Rails에서 작업중에 eval을 쓰고싶은 문제가 있습니다. JSON 인풋을 받아서 DB에 저장하는 경우였는데요.

JSON Array를 입력 받아서 DB에 저장하니 문자열로 "[1, 2, 3]"이렇게 저장이 되더군요. 그래서 eval을 하고 저장했는데요.

eval에 대해 검색하다보니 eval은 왠만하면 안쓰는게 좋다는 글을 봤습니다.

eval대신 어떤 방법을 쓰면 좋을까요?

.

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    eval은 동적으로 구문을 생성/평가/실행하는 용도로 사용합니다

    • 장점 : 동적 구문 생성, 바인딩, 실행. 메타프로그래밍에 유용.
    • 단점 : 느림, 스코프를 넘어선 자원 접근, 보안. ex) Kernel#system - system('shell command')

    문자열로 변환해서(표준 라이브러리 json의 #to_json) 데이터베이스에 적재할 수 있고, 적재된 문자열은 JSON.parse로 파싱해서 다룰 수 있습니다.

    # rspec_test on irb
    require 'json'
    require 'rspec'
    include RSpec::Matchers
    
    json_str = {hi: "sup", yo: "hey"}.to_json
    
    # 1. 문자열을 Hash로 파싱
    parsed = JSON.parse(json_str ) 
    expect( parsed.class ).to eq Hash
    expect( parsed["hi"] ).to eq "sup"
    
    # 2. Hash를 #to_json으로 문자열 변환
    expect( parsed.to_json ).to eq json_str 
    expect( parsed.to_json.class ).to eq String
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)