변수가 Ruby에 정의되어 있는지 확인하는 방법
10991 단어 ruby
Ruby는
defined?(expression)
가 인식할 수 있는 것을 참조하는지 테스트하는 편리한 expression
키워드를 제공합니다. expression
는 객체, 초기화된 변수, 메서드 이름 등이 될 수 있습니다. Ruby가 표현식을 해결할 수 없으면 nil
를 반환합니다. 그렇지 않으면 표현식을 설명하는 문자열을 반환합니다.다음은 다양한 유형의 표현식과 함께
defined?
를 사용하는 몇 가지 예입니다. nil
로 설정된 변수는 여전히 Ruby에서 초기화되고 인식됩니다.RSpec.describe 'Defined' do
it 'tests if the local variable is defined' do
name = 'Akshay'
expect(defined? name).to eq('local-variable')
expect(defined? b).to eq(nil)
expect(defined? nil).to eq('nil')
expect(defined? String).to eq('constant')
expect(defined? 1).to eq('expression')
end
it 'ensures that a variable set to nil is still recognized' do
name = nil
expect(defined? name).to eq('local-variable')
end
end
조건부 할당과 함께 사용
때로는 일부 코드를 한 번만 게으르게 평가하고 싶을 때가 있습니다. 즉, 변수가 있으면 아무것도 하지 않고 없으면 초기화합니다. 관용적 루비 접근법은
||=
연산자를 사용하는 것입니다.def result
@result ||= calculate_result
end
def calculate_result
puts '>>> heavy calculation here.. should happen only once'
100
end
it 'lazy-evaluates the calculate_result operation once' do
expect(result).to eq(100)
expect(result).to eq(100)
end
# Output
>>> heavy calculation here.. should happen only once
결과로 반환
nil
또는 부울 값false
을 반환할 수 있는 작업과 함께 사용하지 않도록 하십시오. 그렇지 않으면 매번 calculate_result
를 호출하여 ||=
연산자의 이점을 제거합니다.예를 들어 위의
calculate_result
메서드를 100 대신 false
(또는 nil
)를 반환하도록 변경하면 Ruby는 calculate_result
가 호출될 때마다 result
를 호출합니다.def calculate_result
puts '>>> heavy calculation here.. should happen only once'
false # or nil
end
# Output
>>> heavy calculation here.. should happen only once
>>> heavy calculation here.. should happen only once
defined?
방법은 이러한 경우에 유용합니다. 먼저 result
변수가 정의되어 있는지 확인하도록 @result
메서드를 변경합니다.def result
return @result if defined? @result
@result = calculate_result
end
정의를 사용하지 않습니까? 해시 키를 확인하려면
일반적인 실수는
defined?
를 사용하여 해시 키가 정의되어 있는지 확인하는 것입니다. 예를 들어,def check_hash_key
hash = {}
defined?(hash['key']) ? 'unexpected!' : 'not defined'
end
it 'does not return false for non-existing hash key' do
expect(check_hash_key).to eq('unexpected!')
end
이는 Ruby가 부울 식에서
method
로 평가하는 문자열 true
을 반환하기 때문입니다.it 'returns method for non-existing hash key' do
data = {}
expect(defined? data['key']).to eq('method')
end
키가 해시에 존재하는지 확인하는 관용적인 루비 솔루션은
has_key?
, key?
, include?
또는 member?
방법 중 하나를 사용하는 것입니다.data = {}
expect(data.key?('key')).to eq(false)
정의를 사용할 때 괄호를 사용합니까?
항상 사용할 필요는 없지만
defined?
키워드의 우선 순위가 낮기 때문에 적극 권장됩니다. 예를 들어 변수가 존재하고 0보다 큰지 확인하려면 다음과 같이 작성할 수 있습니다.it 'has low precedence' do
result = 10
expect(defined? result && result > 0).to eq(true)
end
# Fails!
# expected: true
# got: "expression"
괄호를 추가하면 더 잘 확인할 수 있고 매우 명확합니다. 다음 테스트는 성공적으로 통과했습니다.
it 'has low precedence' do
result = 10
expect(defined? result && result > 0).to eq('expression')
expect(defined?(result) && result > 0).to eq(true)
end
Reference
이 문제에 관하여(변수가 Ruby에 정의되어 있는지 확인하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/software_writer/how-to-check-if-a-variable-is-defined-in-ruby-35df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)