2013-11-04 2 views
3

일부 컨텍스트의 경우 많은 코드가 텍스트 전체에 동일한 텍스트 줄을 사용합니다 (iOS 자동화를 수행하기 위해 Calabash를 사용하고 있습니다).루비에서 변수를 포함하는 상수 문자열을 정의하는 가장 깨끗한 방법은 무엇입니까?

예 : "표시된 모든 레이블 : '# {name}'"이 (가) 특정 클래스에서 8 번 사용되었습니다.

나는 그 텍스트를 사용하는 상수를 가질 수 있지만, 클래스의 맨 위에 던져 넣는다면 물론 "name"변수가 아직 설정되지 않은 것을 선호합니다. 매개 변수를 사용하고 문자열을 반환하는 방법을 정의하지 않고, 클래스의 상단에 존재하지만 할 수없는 본질적으로 같은 것을 할 수있는 방법이 사용될 때까지?

class ClassName 
    extend Calabash::Cucumber::Operations 

    @NAME_CONSTANT = "all label marked:'#{name}'" 

    def self.method_name(name) 
    query("#{@NAME_CONSTANT} sibling label marked:'anotherLabel' isHidden:0") 
    end 
end 

경우에는 평가가 내가 언급 한 구문을 사용하면이 오류가 발생합니다. ClassName에 대한 정의되지 않은 로컬 변수 또는 메서드`name '

+0

루비를 사용하는 버전은 무엇입니까? –

+0

[Module # name] (http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-name)이 존재한다는 것을 기억하십시오 ... 그래서 매개 변수 이름을'name'으로 사용하십시오. 당신의 메소드'method_name'. –

+0

전체 코드를 표시 할 수 있습니까? @ NAME_CONSTANT의 범위를보고 싶습니다. –

답변

1

String#%을 사용하여 나중에 문자열을 삽입 할 수 있습니다.

class ClassName 
    @NAME_CONSTANT = "all label marked:'%{name}'" 

    def self.method_name(insert_name) 
     query("#{@NAME_CONSTANT} sibling label marked:'anotherLabel' isHidden:0" % {name: insert_name}) 
    end 

    def self.query(string) 
     puts string 
    end 
end 

ClassName.method_name('test') 
#=> "all label marked:'test' sibling label marked:'anotherLabel' isHidden:0" 
+0

의견을 보내 주셔서 감사합니다. –

1

@Sergio에 동의합니다. 변수가 포함 된 상수 문자열을 정의하지 마십시오. 그냥 방법을 사용하십시오. 상수에 변수를 포함시키는 것은 나쁜 생각처럼 보입니다. 상수는 정의에 의해, 동적하지한다. 당신이 정말로이 상수 문자열에 변수를 포함 할 경우

, 당신은 지금처럼 contstant에 람다를 할당 할 수

class ClassName 
    extend Calabash::Cucumber::Operations 

    NAME_CONSTANT = ->(name) { "all label marked:'#{name}'" } 

    def self.method_name(name) 
    query("#{NAME_CONSTANT.call(name)} sibling label marked:'anotherLabel' isHidden:0") 
    end 
end 

내가이 생성을 포함하기 때문에, 일정한 전에 @을 제거 상수가 아닌 클래스 수준의 인스턴스 변수.

실제로은 게시 한 코드 샘플을 사용하지 않습니다. 그냥 방법을 사용하십시오. Avdi 그림 형제는 그가 대신 상수의 방법을 사용할 때의 이점에 대해 설명합니다 "Do we need constants?"라는 좋은 게시물을 가지고있다.

+0

예 그것을 매크로라고 부르지 만 루비는 실제로 매크로의 개념을 가지고 있지 않습니다. 파일의 문자열 중 일부는 변수가없고 일부는 수행 할 수 없으며 개발자가 해당 파일에서 조작 할 수있는 문자열이 없으므로 "상수"는 내가 생각할 수있는 가장 가까운 것입니다. 나는 어쨌든 '매크로'로 가야한다고 생각합니다. 우리는 이들 파일 중 여러 파일을 가지고있을 것이므로 결국 이들 파일을 상수 파일로 옮길 수 있습니다. 그 방법을 사용하지 않으려 고했습니다. 의견을 보내 주셔서 감사합니다. –

+0

@iOSTester 허용 한대로 내 대답에 기꺼이 답변 해 주시겠습니까? :) –

+0

아직, 아직 시도하지 않았습니다. 나는 내가 대답으로 사용하는 것을 표시 할 것이다. 감사! –

1

근본적인 문제는 리터럴이 해석 될 때 문자열 보간이 발생하고 참조 된 변수의 범위가 코드의 문자열 위치에 의해 결정된다는 것입니다.

삽입 된 문자열을 메서드에 넣으면 문자열에 사용 된 변수의 로컬 정의에 액세스 할 수 없습니다. 다음과 같이이 해석의 문자열로 "상수"를 선언해야 할 것, 또는

def name_constant(name) 
    "all label marked:'#{name}'" 
end 

: 당신은 같이 사용되는 변수의 값을 전달해야 할 것

@name_constant = '"all label marked:''#{name}''"' 

당신이 그것을 참조 할 때 다음과 같이하고, 그것을 해석 :

eval(@name_constant) 

은 BTW, 나는이 정말 클래스 변수 대에 "상수"를 사용하여 인스턴스 변수없는 문제를 무시했습니다.

+0

예 매크로를 호출해야한다고 가정하지만 Ruby에는 실제로 매크로 개념이 없습니다. 파일의 문자열 중 일부는 변수가없고 일부는 수행 할 수 없으며 개발자가 해당 파일에서 조작 할 수있는 문자열이 없으므로 "상수"는 내가 생각할 수있는 가장 가까운 것입니다. 나는 어쨌든 '매크로'로 가야한다고 생각합니다. 의견을 보내 주셔서 감사합니다. –

관련 문제