2011-09-24 3 views
9

File 라이브러리를 작성한 사람들이 파일 대신 기호로 열리는 파일의 모드를 결정하는 인수를 만들기로 결정한 이유가 궁금합니다. 지금 얼마나문자열 대신 File.new 기호에 대한 인수가없는 이유는 무엇입니까?

는 예를 들어,이는 다음과 같습니다

f = File.new('file', 'rw') 

하지만이 할 수있는 더 좋은 디자인되지 않을 것

f = File.new('file', :rw) 

또는 예를 들어, 심지어

f = File.new(:file, :rw) 

? 이것은 논쟁이 확실히 바뀔 필요가 없으므로 이것을 사용하기에 완벽한 장소 인 것 같습니다.

나는 왜 이런 식으로 나왔는지 알고 싶다.


업데이트 : 방금 a related question about symbols vs. strings을 읽었으며, 기호가 문자열로 잘 알려져 있지 않으며 모든 사람이 문자열을 사용하여 해시 테이블을 색인하는 데 익숙하다고 생각합니다. 그러나 루비의 표준 라이브러리 디자이너가 심볼의 주제에 대해 무지하게 주장하는 것은 타당하지 않을 것이라고 생각합니다. 그래서 그것이 그렇게 생각하지 않습니다.

+5

이것은 libc에서'fopen'으로 돌아가는 역사적인 유물 일뿐입니다. –

+7

'File.new' 모드 ('r','w','+','a','b','t')의 각 순열에 대해 고유 한 기호가 정의되어 있다고 제안 하시겠습니까? – Gabe

+0

큰 질문입니다. 'File :: RDWR'과'File :: CREAT'과 같은 상수가 있습니다 만, 그것에 관한 문서는 찾을 수 없습니다. 'File' [documentation] (http://www.ruby-doc.org/core/classes/File.html)은이 상수를 사용하지만 설명하지는 않습니다. – rdvdijk

답변

2

저는 루비의 역사에 대해 아무런 지식도 없지만, 매개 변수를 메서드에 사용하려면 실제로 문자열, 기호 및 정적 클래스가 필요합니다.

예 : 예외 처리. 각 예외는 실제로 Exception 클래스 유형입니다.

ArgumentError.is_a? Class 
=> True 

그래서 스트림에 대한 각 권한은 자신의 클래스가 될 수 있습니다. 하지만 시스템에 더 많은 클래스가 생성되어야합니다.

기호에 관한 것은 삭제되지 않는다는 것입니다. 생성하는 모든 심볼은 무기한 보존됩니다. 그래서 '.to_sym'메서드를 가볍게 사용하는 것이 좋습니다. 메모리 누수가 발생합니다.

문자열을 조작하기가 더 쉽습니다. 사용자로부터 입력 모드를 얻은 경우 코드의 어딘가에 '.to_sym'이 필요하거나 커다란 스위치 명령문이 필요합니다. 문자열을 사용하면 메소드에 직접 사용자 입력을 전달할 수 있습니다 (물론 신뢰하는 경우).

또한 C에서는 파일 I/O 메서드에 문자를 전달합니다. 루비에는 챠리스가없고 문자열 만 있습니다. 루비가 C에서 어떻게 만들어 졌는지 보면서, 그것이 어디서 왔는지를 알 수 있습니다.

1

이것은 이전 언어의 유물입니다.

+0

나는 동의하지 않는다. 예와 제작자의 진술로 귀하의 주장을 뒷받침 할 수 있습니까? –

+1

이전 언어의 문서는 모두 검색하지 않고 모두이 문자열 형식을 사용하고 있음을 보여줄 것이지만 다음은 다른 웹 언어의 예제입니다. http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

그렇지만 PHP가 왜 그렇게했을까요?언어로서의 PHP는 문자열을 기반으로하기 때문에 그렇습니까? 그것은 PHP가 Perl과 같은 기호를 지원하지 않기 때문입니까? 그게 .. 때문 이니? 내가받는 것은 당신이 당신의 의견이 아니라 대답이라는 증거를 제시하지 않는다는 것입니다. –

관련 문제