2013-08-09 2 views
9

아래 함수의 목적은 두 개의 별 사이에 인수 값을 삽입 한 문자열을 반환하는 것입니다.문자열을 처리하기 위해 "복사"를 사용하지 않을 때 정확히 무슨 일이 일어 났습니까?

star-name: func [name /local stars] [ 
    stars: "**" 
    insert next stars name 
    stars 
] 
print star-name "test" ;*test* 
print star-name "this" ;*thistest*, but what I really want is *this* 

두 번째로 함수를 호출하면 첫 번째 호출의 인수가 계속 삽입 된 상태로 유지됩니다. 대답은 copy "**"을 사용하는 것입니다. , 그것은 "**"에 모든 시간을 stars 변수를 할당하지 않습니다 내 질문은 함수라고? 당신이 시리즈에 설정 단어를 사용하는 경우

답변

6

한 "**"문자열 정의가 필요하지 않습니다 별로이 작업을 수행 할 수있는 또 다른 방법입니다. 블록 - load이 REBOL 내부 형식에 코드를 번역 한 번만 실행되기 때문에 그 정의는 한 번만 REBOL load 기능에 의해 사용됩니다. 함수를 두 번 호출하면 할당이 두 번 발생하지만 할당이 아무 것도 만들지 않고 변수가 동일한 문자열을 다시 참조하도록하는 것은 사실입니다.

당신의 코멘트에서 당신은 당신이 실제로 두 문자열이 load에 의해 생성되는로 이어지는 두 개의 "**"문자열 정의가 통지한다. 당신이

code: [stars: "**" insert next stars something] 
something: "this" 
do code 
something: "that" 
do code 

를 사용하는 경우 당신은 단지 하나의 문자열 정의가 있음을 알 수 있습니다 당신은 어떤 기능이없는 동안 함수가 사용 된 시점의 동작은 동일합니다.

+0

나는 생각을 가지고 있다고 생각한다. Rebol에서 함수는 블록 일뿐입니다. 다른 언어의 함수와는 꽤 다릅니다. 고마워요 :) –

+0

REBOL이 방식으로 작동하는 이유에 대한 통찰력 : [REBOL 퓨어 (Pure) 기능 언어 (http://www.rebol.com/article/0206.html) – rgchris

2

후 기본 동작은 한 번 그 시리즈의 메모리를 할당하는 것입니다. 이렇게하면 함수 호출 사이에 존재하는 정적 변수로 사용할 수 있습니다. 당신이 그 행동을하지 않으려면

, 당신은 명시 적으로 새로운 시리즈 매번 작성하는 시리즈를 복사해야합니다.

는 지역 함수의 경우

star-name: func [ name ][ 
    rejoin [ "*" name "*" ] 
] 
+0

그렇다면 그것은 기능의 특징입니까? 왜냐하면 나는 단지 "stars :"라고 쓰고 있기 때문이다. ** "다음 별을 삽입하라"이 "print stars stars :"** "다음 별을 삽입한다"는 "print stars"는 위의 문제가 없을 것이다. –

+1

이제 두 개의 서로 다른 메모리 주소에 두 개의 다른 시리즈가 있습니다. –

관련 문제