암시 적 변환이 가능합니다. 문제가 발생하는 상황은 어떤 방식으로 작동해야하는지 모르는 경우입니다.
이 예제는 +
운영자가 다른 시간에 다른 방식으로 작업 하는 Javascript에서 볼 수 있습니다 .
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
인수 중 하나가 문자열 인 경우 +
연산자는 문자열 연결이며 그렇지 않은 경우 추가입니다.
인수가 주어졌고 그것이 문자열인지 정수인지 모르고 그것을 추가하고 싶다면 약간 혼란 스러울 수 있습니다.
이것을 다루는 또 다른 방법은 기본 유산에서 온 것입니다 (펄은 다음과 같습니다- 프로그래밍은 어렵다, 스크립팅은 가십시오 ... ).
Basic에서는 len
함수가 String에서 호출되는 것이 의미가 있습니다 ( Visual Basic의 경우 문서 : "모든 유효한 문자열 표현식 또는 변수 이름. Expression이 Object 유형 인 경우 Len 함수는 파일에 기록 될 크기를 반환합니다. FilePut 기능. ").
Perl은 이러한 맥락 개념을 따릅니다. 에 대한 유형의 암시 적 변환과 자바 스크립트에 존재하는 혼란 +
운영자가 때때로 추가되고, 때로는 연결이 펄에서 발생하지 않습니다이 있기 때문 +
입니다 항상 추가 및 .
입니다 항상 연결.
스칼라 컨텍스트에서 스칼라로 사용되는 항목 (예 : 목록을 스칼라로 사용하는 경우 목록은 해당 길이에 해당하는 숫자 인 것처럼 동작 함) 문자열 연산자 ( eq
등식 테스트, cmp
문자열 비교)를 사용하는 경우 스칼라는 문자열 인 것처럼 사용됩니다. 마찬가지로, 수학 문맥에서 어떤 것이 ( ==
등식 테스트 및 <=>
숫자 비교를 위해) 사용 된 경우 스칼라는 숫자 인 것처럼 사용됩니다.
모든 프로그래밍의 기본 규칙은 "사람을 가장 놀라게하는 것"입니다. 그렇다고해서 놀라움이 없다는 것을 의미하는 것은 아니지만 그 노력은 사람을 가장 놀라게하는 것입니다.
perl-php의 가까운 사촌으로 가면 연산자가 문자열이나 숫자 컨텍스트에서 무언가에 대해 행동 할 수 있고 사람들에게 그 행동이 놀라운 상황이 있습니다. ++
작업자는 하나의 이러한 예이다. 숫자에서는 예상대로 정확하게 동작합니다. 과 같은 문자열에 작용할 때 문자열 "aa"
을 증가시킵니다 ( $foo = "aa"; $foo++; echo $foo;
prints ab
). 또한 az
증분 될 때가 되도록 롤오버 됩니다 ba
. 이것은 아직 놀라운 일이 아닙니다.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( 아이디어 )
인쇄됩니다 :
3d8
3d9
3e0
4
암시 적 변환 및 연산자가 동일한 문자열에서 다르게 작동하는 위험에 오신 것을 환영합니다. (Perl은 코드 블록을 조금 다르게 처리합니다.- 연산자가 적용될 "3d8"
때 ++
시작부터 숫자 값으로 결정하고 4
바로 가기 ( ideone )-이 동작은 perlop에 잘 설명되어 있습니다 : 자동 증가 및 자동 감소 )
이제 왜 한 언어가 어떤 방식으로 무언가를하고 다른 언어가 다른 방식으로 디자이너의 디자인 사고에 도달 하는가? Perl의 철학은 하나 이상의 방법이 있다는 것입니다. 저는 이러한 작업을 수행하는 여러 가지 방법을 생각할 수 있습니다. 다른 한편으로, 파이썬은 PEP 20-파이썬의 선 (Phen of Zen of Python)에 기술 된 철학을 가지고 있습니다. "그것을하는 명백한 방법이 있어야합니다.
이러한 디자인 차이로 인해 다른 언어가 사용되었습니다. 파이썬에서 숫자의 길이를 얻는 한 가지 방법이 있습니다. 암묵적인 전환은이 철학에 위배됩니다.
관련 자료 : Ruby에서 Fixnum을 문자열로 암시 적으로 변환하지 않는 이유는 무엇입니까?
perl -e 'print length(100);'
3을 인쇄합니다.