ruby 에서 펄의 use strict 같은 것이 있나요?

sugarlessgirl의 이미지

ruby 에서 펄의 use strict 같은 것이 있나요?

도저히 못찾겠네요..

nohmad의 이미지

Perl에서의 use strict pragma는 인터프리터에게 명시적으로 선언되지 않은 변수를 참조하면 에러를 내도록, 아마도 프로그래머의 실수를 방지하기 위한 목적으로 사용되는 걸로 알고 있습니다. Ruby에는 이런 기능은 없습니다. Perl에서는 선언되지 않은 변수를 사용해도 인터프리터가 빈값(empty)으로 간주해버립니다만, 타입과 예외 시스템이 잘 갖추어진 루비에서는 모든 변수는 객체에 대한 참조이고, 존재하지 않는 객체에 대한 참조는 NameError라는 예외를 던지게 되어 있으므로, strict 모드가 따로 필요하지는 않습니다.

그러나 질문하신 의도를 추정컨대, 전역변수를 말씀하시는 것으로 보입니다. 루비에서 전역변수는 다른 변수들과는 달리 정의되지 않은 이름을 참조했을 때 무조건 nil을 반환하도록 정의되어 있습니다. Ruby의 nil은 동작이 잘 정의된 객체이고, Perl의 empty와는 의미가 다릅니다. 어떤 필요에 의해 use strict pragma와 같은 것을 루비에서 찾으시려는지는 모르겠지만, 일반적인 상황에선 NameError에 대한 예외 처리 정도로 충분하고, 전역변수에 대해서라면 nil? 체크 정도로 해결하실 수 있을 것 같습니다.

PS. 이 게시판에서 Ruby 관련 질문은 처음인 것 같네요. 반갑습니다. ;)

sugarlessgirl의 이미지

제 질문의 의도는 변수 대입시 자동으로 변수가 생성되는 것을 방지하는 거였습니다. (진작 이렇게 물어볼 것을 질문을 잘못했네요)

val1 = 30
vai1 = 25 (val1 = 25 를 의도)

이런 경우를 대비하자는 것이지요.

제가 펄의 use strict 나, Ruby 언어에 대해 제대로 이해를 하지 못하고 있는 것 같습니다.
이번에도 좋은 답변 부탁드립니다. :wink:

PS. nohmad 님의 글에서 언급된 Ruby 를 보고 관심을 갖게 되었지요. 좋은 답변 고맙습니다. :)

nohmad의 이미지

제 추측이 틀린 것 같군요. ;)

인터프리터에게 프로그래머가 명시적으로 선언하지 않은 변수를 사용하지 못하도록 하는 것은 Ruby 언어에서는 불가능합니다. String이나 Array 같은 컨테이너 객체일 경우 내부 원소들이 바뀌지 않도록 freeze를 하거나, 외부에서 위험한 객체가 유입되는 것을 막기 위한 Security 레벨은 존재하지만, 네임스페이스 자체를 틀어막을 수는 없습니다.

말씀하신 것과 같은 상황에서는, 비록 변수 할당에선 체크가 불가능하기 때문에 무탈하게 넘어갔지만, 결국 저 변수를 참조하는 곳에서 문제를 발견할 수 있지 않을까 싶네요. 그외에 루비에는 읽기 전용 변수인 상수가 존재하고, 또 SandBox라는 가상의 클래스를 경유하면, 의도치 않은 실수는 체크할 수 있을 것 같습니다.

class SandBox
  attr_reader   :var1
  attr_accessor :var2
  def initialize
    @var1 = @var2 = 123
  end
  def method_missing(name, args)
    raise NameError, "missing: #{name}(#{args})", caller
  end
end

sb = SandBox.new
puts sb.var1
begin sb.var1 = 456; rescue; end
puts sb.var1

puts sb.var2
sb.var2 = 789
puts sb.var2

begin sb.var3 = 123; rescue; puts $! end
sb.instance_eval("@var1 = 456")
puts sb.var1

매번 sb. 식으로 지정해야 하는 게 좀 불편하긴 하죠. 뭐 사실 Struct를 사용하면 처음 초기화한 멤버 변수 외에는 사용할 수 없도록 할 수도 있지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.