문제

저는 Ruby를 처음 접했고 최근 Ruby on Rails 응용 프로그램을 만들 때 값과 비교하는 문제를 해결했습니다. 컨트롤러에는 항상 False를 반환 한 다음 진술이있었습니다.

if (user.id != params[:id])

문제는 user.id (활성 레코드 인)는 정수이고 Params [: id]는 문자열입니다. 이것을 알아내는 데 시간이 걸렸고 마침내 그것을 변경했습니다.

if (user.id != params[:id].to_i)

이제 진술은 예상대로 작동합니다.

앞으로이 오류를 피하기 위해 두 가지 유형을 비교하려고하면 "컴파일"하거나 루비가 경고하도록하는 방법이 있습니까? 내가 "컴파일 점검"하고 싶은 다른 문제는 다음과 같습니다.

  • 변수를 만들지 만 사용하지 않으면 경고합니다. 가변 이름의 오타를 확인하는 데 도움이됩니다.
  • 메소드 이름 오타를 피하고 메소드의 이름을 바꾸는 경우 메소드 이름 오타를 피하고 리팩토링을 도울 수 있도록 메소드에 메소드가 존재하는지 확인하십시오.

나는 현재 Windows의 Rails 2.3.2와 Radrails IDE와 함께 Ruby 1.8.6-27 RC2를 사용하고 있습니다.

도움이 되었습니까?

해결책 6

내가 찾은 최선의 해결책은 Rubymine과 같은 비행기 구문 검사를 한 IDE였습니다. 그것이 원래의 문제를 해결했는지 확실하지 않지만 다른 구문을 찾고 수정하고 오류를 컴파일하는 데 도움이되었습니다. 귀하의 제안에 감사드립니다.

다른 팁

먼저 테스트 한 다음 코드. 응용 프로그램의 모든 분기를 다루는 테스트를 작성하면 코드가 모두 실행되고 올바른 결과를 생성한다는 확신을 얻습니다.

편집 : 나는 마지막 초까지 메소드 이름에 의존하는 것이 아니라 두 가지 유형을 비교하는 능력이 루비의 핵심 특징임을 지적해야합니다.

객체에 메시지를 보내는 것만 큼 메소드를 호출하지 않습니다. 그런 다음 객체는 메소드를 처리하는 방법을 알아내는 책임이 있습니다. 레일에서 이것은 activerecord의 DB 열에 액세스하는 데 사용됩니다. 열 이름이있는 메시지가 객체로 전송 될 때까지 열에 대한 메소드가 없습니다.

루비의 정적 타이핑은 오리 타이핑 시스템에 반대합니다. 복잡한 상속/인터페이스 체계에 대해 걱정하지 않고 종종 다형성을 무료로 얻을 수 있습니다.

이러한 기능을 수용하고 테스트를 통해 불확실성을 보상하는 것이 좋습니다.

Ruby는 객체의 == 연산자를 재정의 할 수 없습니다. Ruby 1.8에서는 할 수 없습니다. Ruby 1.9는해야했지만 핵심 수업에서 내 대본을 작동시킬 수 없었습니다. 사용자 정의 정의 객체에 적합합니다.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

어리석은 코딩 오류를하지 않았다고 가정하면 대답은 아니요입니다. 다른 유형의 객체를 비교하고 있는지 확인할 수 없습니다.

또한, 나는 당신이하지 않는다고 말할 것입니다. 실제로 루비는 이런 식으로 작동하도록 설계되지 않았으며, 이것은 루비 스타일보다는 자바 접근법입니다.

루비는 안전하지 않아야합니다. 그것은 당신이 두 객체를 비교할 수 있으며, 그 곳은 많은 힘의 출처입니다. 이러한 역동적 인 디자인 없이는 레일이 불가능합니다.

Java 또는 C와 같은 편집 된 언어조차도 두 객체에서 ==를하는 것을 막을 수 없습니다. 벤이 말했듯이 먼저 테스트하는 것이 가장 좋습니다. 함께 작업하고있는 구조를 검사하십시오. 루비 객체에 대한 정보를 얻는 한 가지 방법은 다음과 같습니다.

puts object.class

일반적으로, 동적/스크립팅 언어에 대한 이러한 유형의 문제를 피하는 가장 좋은 방법은 "논리"를 메소드/명령으로 이동시키고 단위 테스트를 작성하는 것입니다. 기본적으로 실패 할 수있는 것은 테스트해야합니다. 페이지의 코드는 멍청한 논리 여야합니다. 특정 기준을 충족하는 항목 만 표시하는 대신 모든 항목을 표시하고 표시 해야하는 메소드에서만 해당 항목 목록을 가져와야합니다.

내가 제안하는 두 가지 :

하나 : IRB (또는 레일의 스크립트/콘솔)에서 읽으십시오. 동적 언어의 일반적인 개발 관행은 "라이브"통역사 (IRB 또는 Rails 콘솔과 같은) 내부의 코드 스 니펫을 시험해 보는 것입니다. 이 연습은 Smalltalk 및 Lisp와 같은 최초의 동적 언어로 거슬러 올라갑니다. Ruby-Debug는 문제 해결 문제에 정말 유용하며 예에서 오류를 파악하는 데 정말 쉬운 방법이었을 것입니다.

둘 : "오리 타이핑"을 읽으십시오. "유형"과 변수는 많은 사람들이 기대하는 것과는 루비에서 약간 다르게 작동합니다. 이해할 수 있듯이 user.id와 같은 변수에는 "유형"이 없습니다. 가치 지적했다 user.id는 유형이 있지만 변수 자체는 그렇지 않습니다. 나는 그것이 프로그램을 실행하기 전에 당신의 오류가 무엇인지 알려줄 도구가없는 이유의 일부라고 생각합니다. 변수에 유형이 없기 때문에이 두 변수를 비교하는 것은 오류가 아닙니다. user.id는 프로그램의 해당 시점에서 정수를 가리키고 있었지만 user.id를 문자열을 가리키도록 할당하는 것은 완벽하게 합법적입니다. :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top