Ruby에서 Python의 명명 된 printf 매개 변수를 어떻게 모방합니까?
문제
파이썬에서는 다음을 수행 할 수 있습니다.
print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
이 행동을 복제하는 가장 가까운 가장 단순한 루비 관용구는 무엇입니까? (문자열 클래스를 원숭이를 입히지 마십시오.)
편집하다: 이것의 정말 탁월한 이점 중 하나는 사전 처리 된 문자열을 변수에 저장하고 다음과 같이 "템플릿"으로 사용할 수 있다는 것입니다.
template = "Hi! I'm %(name)s, and I'm %(age)d years old."
def greet(template,name,age):
print template % ({"name":name,"age":age})
이것은 분명히 사소한 예이지만 나중에 사용하기 위해 그러한 문자열을 저장할 수있는 유틸리티가 많이 있습니다. 루비 "Hi! I'm #{name}"
컨벤션은 부적절하게 비슷하지만 즉각적인 평가는 덜 다재다능합니다.
제안을 제안하는 답변을 다운베트하지 마십시오 #{var}
이 편집 전에서 온 기술. (무작위 아이디어 커널 : 질문 저자가 그들을 "구식"으로 표시하는 경우에 대한 대답을 투표로부터 보호해야 할 것입니다 ...?)
해결책
당신은 또한 사용할 수 있습니다
printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"}
또는
data = {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
또는 (이것은 루비 1.9가 필요합니다. 다른 예제는 확실하지 않습니다)
data = {key1: "value1", key2: "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
이 지문
1: value1 2: value2
중요한 제한 : 해시의 중고 키 (데이터 내 예에서)는 상징이어야합니다.
위의 예에 대한 언급 :printf
하나의 형식 문자열과 선택적 매개 변수를 취합니다. 그러나 a도 있습니다 String#%
-방법.
다음 네 번의 통화는 모두 동일한 결과를 가져옵니다.
printf "1: %<key1>s 2: %<key2>s\n" , {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
print "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
puts "1: %<key1>s 2: %<key2>s" % {:key1 => "value1", :key2 => "value2"}
두 번째 버전은 먼저 사용합니다 String#%
-메드를하고 결과를 보냅니다 printf
.
다른 팁
당신은 이것을 좋아합니다 :
values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
자세한 내용은 다음과 같이 읽으십시오.http://ruby.runpaint.org/strings#sprintf-hash
더 정교한 것이 필요한 경우 ERB 및 Google 템플릿 엔진에 대해 읽으십시오. 웹 페이지, 이메일 등을 생성 해야하는 경우 템플릿 엔진을 사용하는 것이보다 강력한 솔루션이라는 것을 알 수 있습니다.
루비에는 이것에 대한 좋은 트릭이 있습니다.
name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
class Template
def %(h)
"Hi! I'm #{h[:name]}s, and I'm #{h[:age]}d years old."
end
end
그런 다음 전화하십시오
t=Template.new
t%({:name => "Peter", :age => 18})
이것은 당신이 요구 한 것이 아니라 힌트를 줄 수 있습니다.
Ruby의 두 배로 인용 된 문자열에서는 다음과 같은 루비 표현의 결과를 삽입 할 수 있습니다.
puts "Hi! I'm #{name}, and I'm #{age} years old."
곱슬 괄호 안에 표현을 넣으십시오. ( #{age + 5} 또는 #{name + '' + last_name} 또는 함수 호출과 같은 더 복잡한 것일 수도 있습니다.)
그럼에도 불구하고 작동하는 것은 다음과 같은 선을 따라 무언가입니다.
d = {"key1" => "value1", "key2" => "value2"}
s = "string to be magically induced with variables, which are \n * %s and \n * %s.\n"
print s%d.values()
# or
print s%[d["key1"], d["key2"]]
"안녕하세요! 나는 #{name}이고 나는 #{age} 나이가 많다"고 말했다.